2017-03-24 10 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; 
} 

を拡張する別のクラスを持って、私が持っています

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

をwirteしかし、私は

を書きたいします
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 'パブリック静的で動作します(これは{new({}):T}、propName:(keyof T)):文字列{ return propName; } ' 大変ありがとう! –