TypeScript 如何定义返回与入参属性同名方法对象的函数返回类型
解决方案
你自定义的映射类型逻辑是正确的,问题出在两个地方:一是没有给someGenerator函数显式标注返回类型,二是TS无法自动推断reduce操作的最终返回结构,需要手动补充类型断言。另外建议不要用和TS内置工具类型重名的ReturnType作为自定义类型名,避免冲突。
步骤1:定义映射类型
// 避免和TS内置ReturnType重名,改名GeneratorResult type GeneratorResult<P> = { [K in keyof P]: () => void; };
步骤2:修改函数的类型标注
function someGenerator<P extends object>(params: P): GeneratorResult<P> { return Object.keys(params).reduce((acc, key) => ({ ...acc, [key]: () => { // 补充key的类型断言,解决Object.keys返回string无法索引泛型对象的问题 console.log(params[key as keyof P]); }, }), {} as GeneratorResult<P>); // 给初始值加类型断言,明确reduce的返回类型 }
效果验证
你原本的测试代码可以正常获得类型提示:
type Params = { str: string; } const params = { str: 'some text', } const someInstance = someGenerator<Params>(params); // TS会正确识别someInstance上存在str方法,调用无报错 someInstance.str();
内容的提问来源于stack exchange,提问作者user12499410
相关产品推荐
相关产品推荐

