【问题标题】:Typescript conditional types based upon a function type基于函数类型的打字稿条件类型
【发布时间】:2021-09-05 16:18:14
【问题描述】:

是否可以在 Typescript 中根据函数类型编写条件类型?

我们可以基于对象接口实现条件类型,但想知道我们是否可以针对函数类型做同样的事情。

如下所示:

type func<T> = (val: any) => T
type Optional<T> = (val: any) => T | undefined

type FilterOptional<T> = T extends Optional<any> ? undefined : T

type a = FilterOptional<(val: any) => number>
// a is undefined but need it to be (val: any) => number

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    如果你的意图是返回undefined,如果返回类型包含undefined,那么你可以试试这个:

    type FilterOptional<T extends (...args: any) => any> = undefined extends ReturnType<T> ? undefined : T
    
    type a = FilterOptional<(val: any) => number> // (val: any) => number
    type b = FilterOptional<(val: any) => number | undefined> // undefined
    

    【讨论】:

      【解决方案2】:

      你当然可以。

      事实上,您的代码无需修改即可运行。我只是添加一些例子:

      type func<T> = (val: unknown) => T
      
      type foo<T> = T extends func<any> ? T : undefined // some other types
      
      // Take positive conditional branch
      type A = foo<() => void> // () => void
      type B = foo<(val: number) => void> // (val: number) => void
      
      // Take negative conditional branch
      type C = foo<(val: number, secondArg: string) => void> // undefined
      type D = foo<number> // undefined
      

      Playground

      【讨论】:

      • 对不起,我的第一个例子没有明确我的意图。我已经更新了代码 sn-p。
      猜你喜欢
      • 1970-01-01
      • 2022-07-07
      • 2021-09-17
      • 2019-05-03
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多