TypeScript中如何利用keyof获取属性类型,优化setParameter方法?
解决TypeScript中setParameter方法的类型提示问题
完全可以通过T extends keyof Settings来获取属性对应的类型,替换掉any,从而为用户提供准确的参数类型提示。只需要把data的类型指定为Settings[T]即可,这是TypeScript的索引访问类型特性,能根据属性名动态获取对应属性的类型。
修改后的完整代码如下:
class Settings { a: number = 0; b: string = "xyz"; } class Manager { settings: Settings = new Settings(); constructor() {} update(){/* 重绘场景的逻辑实现 */} setParameter<T extends keyof Settings>(name: T, data: Settings[T]) { this.settings[name] = data; this.update(); } }
关键说明:
T extends keyof Settings:约束name参数只能是Settings类的合法属性名(即"a"或"b")Settings[T]:利用索引访问类型,动态匹配当前name对应的属性类型。比如传入name="a"时,data必须是number类型;传入name="b"时,data必须是string类型- 修复了原代码中的两处疏漏:初始化
settings属性,以及调用类成员时添加this关键字,避免运行时错误
修改后调用setParameter时,TypeScript会自动给出精准的类型提示,比如:
const manager = new Manager(); manager.setParameter("a", 123); // 合法,data为number类型 manager.setParameter("b", "abc"); // 合法,data为string类型 manager.setParameter("a", "abc"); // 报错,类型不匹配
内容的提问来源于stack exchange,提问作者Patrik Bašo
相关产品推荐
相关产品推荐

