如何为高阶函数返回的泛型函数变量设置泛型类型?
解决方案
要让getB成为可指定泛型的函数,同时避免手动声明复杂类型,只需调整高阶函数generator的泛型定义逻辑,将泛型参数从generator本身转移到它返回的函数上:
function generator() { return <T>(b: T) => b; } // typeof getB = <T>(b: T) => T const getB = generator(); // typeof getNumber = (b: number) => number const getNumber = getB<number>; getNumber("hello"); // 类型报错:"string"类型参数无法赋值给"number"类型参数 getNumber(1142); // 正常运行 // typeof getString = (b: string) => string const getString = getB<string>; getString("hello"); // 正常运行 getString(1142); // 类型报错:"number"类型参数无法赋值给"string"类型参数
原理说明
原代码中,generator<B>()的泛型参数B在调用generator()时会被自动推断为unknown(既没手动指定类型,也无上下文可推导),因此返回的函数类型被固定为(b: unknown) => unknown。
修改后的generator不再声明自身的泛型参数,转而让它返回的函数成为泛型函数。此时调用generator()得到的getB本身就是一个泛型函数,后续使用时通过<T>指定具体类型即可,TypeScript会自动推导并约束函数的参数与返回值类型,彻底规避了手动声明复杂类型带来的代码脆弱问题。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

