基于函数类型的打字稿条件类型

时间:2021-06-22 03:53:45

标签: typescript typescript-generics

是否可以在 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你当然可以。

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

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

相关问题