【问题标题】:why TypeScript condition type can't work correctly for optional parameter?为什么 TypeScript 条件类型对于可选参数不能正常工作?
【发布时间】:2021-08-27 10:54:51
【问题描述】:

我想知道函数的第一个参数是可选的,所以我写了这个:

type F1 = (payload?: number) => null;
type Res1 = F1 extends (a?: any) => any ? 1 : 2; // got 1
type Res2 = F1 extends (a: any) => any ? 1 : 2; // got 1, but 2 expected

type F2 = (payload: number) => null;
type Res3 = F2 extends (a?: any) => any ? 1 : 2; // got 1, but 2 expected
type Res4 = F2 extends (a: any) => any ? 1 : 2; // got 1

他们都等于1,为什么?我该怎么办?

【问题讨论】:

    标签: typescript types optional-parameters conditional-types


    【解决方案1】:

    您可以将“扩展”理解为“可分配给”。

    type F1 = (payload?: number) => null;
    type Res2 = F1 extends (a: any) => any ? 1 : 2; // got 1, but 2 expected
    

    (payload?: number) => null 可以分配给 (a: any) => any 吗?让我们检查一下:

    // Works
    const res2: (a: any) => any = (payload?: number) => null;
    

    (a: any) => any 接受 a 的任何值,包括 undefined 或有效负载指定的数字,因此我们可以看到 (payload?: number) => null 是可分配的,因此 F1 extends (a: any) => any 应该评估为 true 并返回 1。

    相反,您可以使用 Partial 将要测试的函数的参数设为可选,并检查结果参数是否可分配给原始参数:

    
    type ArgumentType<F extends (...args: any) => any> = F extends (...args: infer A) => any ? A : never;
    
    type FirstArgumentOptional<F extends (...args: any) => any> =
        Partial<ArgumentType<F>> extends ArgumentType<F>
            ? true 
            : false
    
    
    type T1 = FirstArgumentOptional<(a: any) => any>; // false
    type T2 = FirstArgumentOptional<(a?: any) => any>; // true
    type T3 = FirstArgumentOptional<() => any>; // true
    
    

    【讨论】:

      猜你喜欢
      • 2023-01-25
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多