TypeScript中如何为回调参数加类型且不破坏返回类型推导
TypeScript中create2函数的类型适配方案
你当前的create2函数使用单个泛型T同时约束回调函数的参数类型和返回类型,导致返回类型被限制为与参数类型一致,无法自动推导回调函数实际的返回类型。要实现指定参数类型+自动推导返回类型的需求,只需将泛型拆分为两个独立的类型参数:
修改后的create2函数
function create2<T, R>(callback: (arg: T) => R): R { // 使用类型断言处理null与T类型不匹配的问题 return callback(null as unknown as T); }
使用示例
调用时只需显式指定参数类型T,返回类型R会由TypeScript自动根据回调函数的返回值推导:
// 参数类型为{ data: string },返回类型自动推导为number const numberType2 = create2<{ data: string }>(({ data }) => 1); // 参数类型为{ is: boolean },返回类型自动推导为string const stringType2 = create2<{ is: boolean }>(({ is }) => 'foo');
原理说明
T:专门用于约束回调函数的参数类型,由调用者显式指定R:用于接收回调函数的返回类型,由TypeScript根据回调函数的实际返回值自动推导- 类型断言
null as unknown as T:解决null无法直接赋值给T类型参数的编译错误,若实际场景中参数有合法值,可替换为对应值
内容的提问来源于stack exchange,提问作者Jon Sud
相关产品推荐
相关产品推荐

