TypeScript:具有可变结构的方法返回类型如何定义?
解决方案
你可以利用TypeScript的泛型、映射类型和模板字面量类型来精确定义myMethod的返回类型,让TypeScript能根据传入的属性数组自动推断出带Trigger后缀的键结构。
完整代码示例
// 先定义你的NotRelevantType type NotRelevantType = { /* 这里写实际的类型定义 */ }; class T { propA: number; propB: string; method() {} } // 泛型版本的myMethod function myMethod<T, K extends keyof T>( obj: T, properties: readonly K[] ): { [P in K as `${string & P}Trigger`]: NotRelevantType } { const result: Record<string, NotRelevantType> = {}; // 实现逻辑:遍历属性数组生成对应Trigger键 for (const prop of properties) { result[`${prop}Trigger`] = {} as NotRelevantType; // 替换为实际的Trigger创建逻辑 } return result as { [P in K as `${string & P}Trigger`]: NotRelevantType }; } const obj = new T(); const result = myMethod(obj, ['propA', 'propB']); // result的类型会被推断为:{ propATrigger: NotRelevantType; propBTrigger: NotRelevantType }
关键细节说明
泛型约束:
- 用
T捕获传入对象的类型,K extends keyof T确保properties数组里的元素都是对象T的有效属性名,避免传入不存在的属性。 - 把
properties设为readonly K[],让TypeScript能精确推断出K的具体值(而不是宽泛的string)。
- 用
映射类型+模板字面量:
{ [P in K as${string & P}Trigger]: NotRelevantType }是核心:P in K遍历所有传入的属性名;as${string & P}Trigger``用模板字面量给每个属性名添加Trigger后缀;- 每个键对应的类型都是
NotRelevantType。
如果对象类型是any的兼容写法
如果不需要限制properties必须是对象的有效属性,可以简化为:
function myMethod<K extends string>( obj: any, properties: readonly K[] ): { [P in K as `${P}Trigger`]: NotRelevantType } { // 实现逻辑同上 }
内容的提问来源于stack exchange,提问作者Mikelgo
相关产品推荐
相关产品推荐

