180

typescriptインターフェイスで静的プロパティを宣言したいだけですか?私はこれに関してどこにも見つかりませんでした。

interface myInterface {
  static Name:string;
}

出来ますか?

4

17 に答える 17

163

@Duncanの@Bartvdsの回答に従ってください。ここで、何年も経った後に実行可能な方法を提供します。

Typescript 1.5 がリリースされた後のこの時点で (@Jun 15 '15)、便利なインターフェース

interface MyType {
    instanceMethod();
}

interface MyTypeStatic {
    new():MyType;
    staticMethod();
}

デコレーターの助けを借りて、このように実装できます。

/* class decorator */
function staticImplements<T>() {
    return <U extends T>(constructor: U) => {constructor};
}

@staticImplements<MyTypeStatic>()   /* this statement implements both normal interface & static interface */
class MyTypeClass { /* implements MyType { */ /* so this become optional not required */
    public static staticMethod() {}
    instanceMethod() {}
}

github issue 13462の私のコメントを参照してください。

視覚的な結果: 静的メソッドが見つからないというヒントを含むコンパイル エラー。 ここに画像の説明を入力

静的メソッドが実装された後、メソッドのヒントがありません。 ここに画像の説明を入力

静的インターフェイスと通常のインターフェイスの両方が満たされた後、コンパイルは成功しました。 ここに画像の説明を入力

于 2017-04-28T07:24:17.387 に答える
64

TypeScript のインターフェイスで静的プロパティを定義することはできません。

Dateの定義に追加しようとするのではなく、オブジェクトを変更したいとしDateます。それをラップするか、単純にリッチな日付クラスを作成して、実行できDateないことを行うことができます。

class RichDate {
    public static MinValue = new Date();
}

Date は TypeScript のインターフェイスであるため、キーワードを使用してクラスで拡張することはできません。date がクラスであるextends場合、これは良い解決策になるため、これは少し残念です。

Date オブジェクトを拡張MinValueしてプロトタイプにプロパティを提供する場合は、次のことができます。

interface Date {
    MinValue: Date;
}

Date.prototype.MinValue = new Date(0);

次を使用して呼び出されます:

var x = new Date();
console.log(x.MinValue);

また、インスタンスなしで利用できるようにしたい場合は、それもできます...しかし、それは少しうるさいです。

interface DateStatic extends Date {
    MinValue: Date;
}

Date['MinValue'] = new Date(0);

次を使用して呼び出されます:

var x: DateStatic = <any>Date; // We aren't using an instance
console.log(x.MinValue);
于 2012-12-19T15:25:46.847 に答える
16

静的プロパティは通常、オブジェクトの (グローバル) コンストラクターに配置されますが、"interface" キーワードはオブジェクトのインスタンスに適用されます。

クラスを TypeScript で記述している場合、前の回答はもちろん正しいです。他の場所で既に実装されているオブジェクトを記述している場合、静的プロパティを含むグローバル コンストラクターを次のように宣言できることを知っておくと、他の人に役立つかもしれません。

declare var myInterface : {
  new(): Interface;
  Name:string;
}
于 2012-12-20T14:54:16.267 に答える
4

静的クラス (つまり、すべてのメソッド/プロパティが静的) を定義しようとしている場合は、次のようにすることができます。

interface MyStaticClassInterface {
  foo():string;
}

var myStaticClass:MyStaticClassInterface = {
  foo() {
    return 'bar';
  }
};

この場合、静的な「クラス」は実際には単純な js オブジェクトであり、すべてのメソッドを実装しています。MyStaticClassInterface

于 2015-01-11T20:49:38.103 に答える