TypeScript中如何使用索引类型访问嵌套属性名对应的方法
问题原因
你定义的meth为string类型过于宽泛,TypeScript无法保证任意字符串一定是你选中的prop属性下的合法方法名,因此触发了索引类型的安全校验报错。
解决方式
固定属性场景
如果已经确定要访问的属性名,可以直接收窄方法名的类型为对应属性下的键集合:
type Property = keyof MyClass; const obj = new MyClass(); const prop: Property = 'prop1'; // 直接将meth的类型限定为prop对应属性下的合法键 const meth: keyof MyClass[typeof prop] = 'method2'; obj[prop][meth](); // 编译正常
动态传参场景
如果需要动态传入属性名和方法名,可以通过泛型工具函数约束两者的对应关系,保证传入的方法名一定属于对应属性的合法键:
function callNestedMethod<T extends keyof MyClass>( instance: MyClass, prop: T, methodName: keyof MyClass[T] ) { return instance[prop][methodName](); } // 调用时自动校验合法性 callNestedMethod(obj, 'prop1', 'method2'); // 合法 callNestedMethod(obj, 'prop1', 'method3'); // 编译阶段直接报错:prop1下不存在method3
拓展说明
如果需要复用嵌套方法名的类型规则,可以单独定义泛型类型别名:
type NestedMethod<T extends keyof MyClass> = keyof MyClass[T]; // 使用示例 const meth1: NestedMethod<'prop1'> = 'method1'; // 合法 const meth2: NestedMethod<'prop2'> = 'method3'; // 合法
内容的提问来源于stack exchange,提问作者jhummel
相关产品推荐
相关产品推荐

