如何用TypeScript工具类型获取类方法,避免调用非方法属性报错
如何用TypeScript工具类型提取类的方法名类型?
你可以自定义一个Methods工具类型,专门过滤出类中属于函数类型的键名,避免把属性名误当作方法名调用的问题:
type Methods<T> = { [K in keyof T]: T[K] extends Function ? K : never; }[keyof T];
类型逻辑说明
- 遍历目标类型
T的所有键K - 检查键对应的类型
T[K]是否为函数类型:是则保留键名K,否则标记为never - 最后通过
[keyof T]提取所有非never的键,得到类中所有方法名的联合类型
使用示例
先定义一个包含属性和方法的类:
class MyClass { className: string = "MyClass"; sayHello() { console.log("Hello!"); } getVersion(): number { return 1.0; } }
此时Methods<MyClass>的类型为"sayHello" | "getVersion",仅包含方法名。之后就能安全地做类型断言:
const someMethod = "sayHello"; this.myClass[someMethod as Methods<MyClass>](); // 类型安全,无调用错误风险
而如果用keyof typeof MyClass,得到的是"className" | "sayHello" | "getVersion",包含了非函数的属性名,用这个断言时很容易出现把属性当作方法调用的错误。
内容的提问来源于stack exchange,提问作者Sherif eldeeb
相关产品推荐
相关产品推荐

