2017-03-24 49 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; }' 太好了,非常感謝! –