TypeScript泛型函数类型如何无需指定参数仍进行类型检查?
解决泛型函数类型作为参数时的类型推导问题
核心问题
你定义的MyFunc是泛型类型别名,必须显式传入类型参数才能使用,直接写MyFunc会触发"缺少类型参数"的错误。要保留类型检查同时无需提前指定T,可以通过以下两种方式实现:
方法一:将调用函数定义为泛型函数
通过让makeArray成为泛型函数,TypeScript会根据你调用qux时传入的参数自动推导T的类型,同时约束qux必须符合MyFunc<T>的类型要求:
type Foo = {}; type MyFunc<T extends Foo> = (a: T, b: T) => T[]; const bar: MyFunc<number> = (a: number, b: number) => [a, b]; const baz: MyFunc<boolean> = (a: boolean, b: boolean) => [a, b]; // 泛型函数:T会根据qux的调用参数自动推导 const makeArray = <T extends Foo>(qux: MyFunc<T>) => qux(1, 2); // 合法调用:bar是MyFunc<number>,匹配qux(1,2)的参数类型 const numberArray = makeArray(bar); // numberArray类型为number[] // 非法调用:baz是MyFunc<boolean>,无法接收number类型参数 // const booleanArray = makeArray(baz); // TypeScript会报错
方法二:直接使用泛型函数类型作为参数
如果不需要单独的MyFunc类型别名,可以直接将参数类型定义为泛型函数,这样写法更简洁,同样能保留类型约束:
type Foo = {}; // 参数qux直接定义为泛型函数,约束参数同类型且继承自Foo const makeArray = (qux: <T extends Foo>(a: T, b: T) => T[]) => qux(1, 2); const bar = (a: number, b: number) => [a, b]; const baz = (a: boolean, b: boolean) => [a, b]; const numberArray = makeArray(bar); // 正确,返回number[] // const booleanArray = makeArray(baz); // 错误,参数类型不匹配
为什么原写法不行?
MyFunc<T>是泛型类型别名,TypeScript无法自动为类型别名推导泛型参数,必须显式指定T。而泛型函数的方式会将类型推导延迟到函数调用时,既满足了"参数a/b同类型且继承Foo"的约束,又不需要提前固定T的具体类型,同时避免了any带来的类型检查丢失问题。
内容的提问来源于stack exchange,提问作者Nate Glenn
相关产品推荐
相关产品推荐

