2017-03-24 111 views
0

我有一个抽象类打字稿 - 类型推理与keyof关键字

export abstract class ABaseModel { 
    public static isKeyOf<T>(propName: (keyof T)): string { 
    return propName; 
    } 
} 

和延伸它

export class Model extends ABaseModel { 

    public id: number; 
    public uid: string; 
    public createdByUid: string; 
} 

要检查一个字符串是否是这个类的一个有效的财产另一个类,我有到WIRTE

Model.isKeyOf<Model>('id'); 

但我想写

Model.isKeyOf('id'); 

类型推断不可能吗?

回答

1

这似乎工作:

abstract class ABaseModel { 
    public static isKeyOf<T>(this: { new(): T }, propName: (keyof T)): string { 
     return propName; 
    } 
} 

Model.isKeyOf("id"); // ok 
Model.isKeyOf("name"); // error: Argument of type '"name"' is not assignable to parameter of type '"id" | "uid" | "createdByUid"' 

code in playground

+0

四处错误:类型typeof运算模式“的“这个”背景下是不能分配给“这”类型的方法的“新的() =>模型'。 –

+0

你的'Model'类的签名是什么?它应该是相同的,例如,如果它是'class Model {constructor(a:string,b:number){...}}'那么你应该使用:'(this:{new(a:string,b:number ):T】' –

+0

构造函数是 '构造(道具:任何[]){ 超(); Object.assign(这一点,道具); }' 所以它的工作原理与 '公共静态isKeyOf (this:{new({}):T},propName:(keyofT)):string { return propName; }' 太好了,非常感谢! –