如何在参数为值或回调函数时使用TypeScript泛型
问题分析与解决方案
错误原因
你当前的代码中,当ab是函数类型时,定义的是((v: T) => T)——这要求函数的参数必须是泛型T类型,但你实际传入的是固定的string值"hello"。一旦T不是string类型(比如number、boolean等),就会出现类型不兼容的错误,因为"hello"无法匹配T的类型约束。
修正方案
首先明确允许的T类型范围,然后调整函数参数的类型定义:让函数分支接受string类型的参数(因为你固定传入"hello"),返回值为T。代码如下:
type AllowedTypes = string | number | boolean | object | Array<any> | Function; function a<T extends AllowedTypes>(ab: T | ((v: string) => T)) { if (typeof ab === "function") { return ab("hello"); } else { return ab; } }
验证示例
- 直接传入非函数值:
a("world")返回string,a(456)返回number,a(true)返回boolean,均符合预期。 - 传入函数:
a((str) => str.length)返回number,a(() => ({name: "test"}))返回object,a(() => () => {})返回function,类型校验正常通过。
内容的提问来源于stack exchange,提问作者jainChetan81
相关产品推荐
相关产品推荐

