TypeScript:传递泛型类型的工厂函数正确实现方法
正确实现泛型工厂函数的方案
你的代码报错核心原因是**fooFn<T>的定义存在泛型冲突**:你在fooFn<T>内部又声明了一个同名的泛型参数<T>,这个内部的T和工厂函数generator的泛型T是完全独立的两个类型参数,导致TypeScript无法识别它们的关联,从而抛出类型不兼容的错误。
正确实现方式
只需要修改fooFn的类型定义,去掉函数本身的泛型声明,让它成为一个固定接受T类型参数并返回T类型的函数类型即可:
// 定义接受T类型参数、返回T类型的函数类型 type fooFn<T> = (t: T) => T; const generator = <T>(): fooFn<T> => { return (t: T): T => { console.log(t); return t; }; }; const foo = generator<number>(); foo(1); // 正常编译通过 foo('test'); // 编译报错:类型“string”的参数不能赋给类型“number”的参数
更简洁的写法(省略显式类型定义)
如果不需要单独复用fooFn类型,可以直接让TypeScript自动推断返回的函数类型,代码更简洁:
const generator = <T>() => { return (t: T): T => { console.log(t); return t; }; }; const foo = generator<number>(); foo(1); // 正常编译 foo('test'); // 编译报错
这两种写法都能实现你的需求:通过工厂函数指定泛型类型后,生成的函数会严格校验参数类型,传入错误类型时TypeScript会准确抛出编译错误。
内容的提问来源于stack exchange,提问作者theahura
相关产品推荐
相关产品推荐

