484

TypeScriptクラスでは、プロパティの型を宣言できます。次に例を示します。

class className {
  property: string;
};

オブジェクトリテラルでプロパティのタイプをどのように宣言しますか?

次のコードを試しましたが、コンパイルされません。

var obj = {
  property: string;
};

次のエラーが発生します。

名前'string'は現在のスコープに存在しません

私は何か間違ったことをしていますか、それともこれはバグですか?

4

14 に答える 14

560

あなたはかなり近いです。 を に置き換えるだけ=です:。オブジェクト型リテラル (仕様セクション 3.5.3 を参照) またはインターフェイスを使用できます。オブジェクト型リテラルの使用は、あなたが持っているものに近いです:

var obj: { property: string; } = { property: "foo" };

ただし、インターフェイスを使用することもできます

interface MyObjLayout {
    property: string;
}

var obj: MyObjLayout = { property: "foo" };
于 2012-10-08T19:08:38.090 に答える
343

2019-05-15 更新 (代替としての改善されたコード パターン)

constより機能的なコードを長年使用し、その恩恵を受けてきた私は、ほとんどの場合、以下を使用しないことをお勧めします。(オブジェクトを構築するとき、型システムに型を推測させるのではなく、型システムを特定の型に強制することは、多くの場合、何かが間違っていることを示しています)。

代わりにconst、可能な限り変数を使用してから、最終ステップとしてオブジェクトを構成することをお勧めします。

const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
  • これにより、明示的な入力を必要とせずにすべてが適切に入力されます。
  • フィールド名を再入力する必要はありません。
  • これは、私の経験から最もクリーンなコードにつながります。
  • これにより、コンパイラはより多くの状態検証を提供できます (たとえば、複数の場所で戻る場合、コンパイラは常に同じ型のオブジェクトが返されることを保証します。これにより、各位置で戻り値全体を宣言することが推奨されます)。その値の意図)。

追記 2020-02-26

遅延初期化できる型が実際に必要な場合: null 許容共用体型 (null または Type) であることをマークします。型システムは、最初に値があることを確認せずに使用することを防ぎます。

ではtsconfig.json、厳密な null チェックを有効にしてください。

"strictNullChecks": true

次に、このパターンを使用して、型システムが偶発的な null/未定義アクセスから保護できるようにします。



const state = {
    instance: null as null | ApiService,
    // OR
    // instance: undefined as undefined | ApiService,

};

const useApi = () => {
    // If I try to use it here, the type system requires a safe way to access it

    // Simple lazy-initialization 
    const api = state?.instance ?? (state.instance = new ApiService());
    api.fun();

    // Also here are some ways to only access it if it has value:

    // The 'right' way: Typescript 3.7 required
    state.instance?.fun();

    // Or the old way: If you are stuck before Typescript 3.7
    state.instance && state.instance.fun();

    // Or the long winded way because the above just feels weird
    if (state.instance) { state.instance.fun(); }

    // Or the I came from C and can't check for nulls like they are booleans way
    if (state.instance != null) { state.instance.fun(); }

    // Or the I came from C and can't check for nulls like they are booleans 
    // AND I was told to always use triple === in javascript even with null checks way
    if (state.instance !== null && state.instance !== undefined) { state.instance.fun(); }
};

class ApiService {
    fun() {
        // Do something useful here
    }
}

99% のケースで以下を実行しないでください。

更新 2016-02-10 - TSX を処理するには (@Josh に感謝)

asTSXの演算子を使用します。

var obj = {
    property: null as string
};

より長い例:

var call = {
    hasStarted: null as boolean,
    hasFinished: null as boolean,
    id: null as number,
};

元の回答

キャスト演算子を使用して、これを簡潔にします (目的の型に null をキャストすることにより)。

var obj = {
    property: <string> null
};

より長い例:

var call = {
    hasStarted: <boolean> null,
    hasFinished: <boolean> null,
    id: <number> null,
};

これは、2 つの部分 (型を宣言する部分とデフォルトを宣言する部分) を持つよりもはるかに優れています。

var callVerbose: {
    hasStarted: boolean;
    hasFinished: boolean;
    id: number;
} = {
    hasStarted: null,
    hasFinished: null,
    id: null,
};
于 2012-10-11T04:50:12.790 に答える
22

型注釈を記述しようとしている場合、構文は次のとおりです。

var x: { property: string; } = { property: 'hello' };

オブジェクト リテラルを記述しようとしている場合、構文は次のとおりです。

var x = { property: 'hello' };

あなたのコードは、値の位置で型名を使用しようとしています。

于 2012-10-08T19:08:32.473 に答える
9

TypeScript でオブジェクトを宣言する場合、次の構文を使用します。

[access modifier] variable name : { /* structure of object */ }

例えば:

private Object:{ Key1: string, Key2: number }
于 2017-01-08T15:05:17.067 に答える
4

あなたのコードで:

var obj = {
  myProp: string;
};

実際にオブジェクト リテラルを作成し、変数文字列をプロパティ myProp に割り当てています。非常に悪い習慣ですが、これは実際には有効な TS コードです (これを使用しないでください!):

var string = 'A string';

var obj = {
  property: string
};

ただし、必要なのは、オブジェクト リテラルが型付けされていることです。これは、さまざまな方法で実現できます。

インターフェース:

interface myObj {
    property: string;
}

var obj: myObj = { property: "My string" };

タイプ エイリアス:

type myObjType = {
    property: string
};

var obj: myObjType = { property: "My string" };

オブジェクト型リテラル:

var obj: { property: string; } = { property: "Mystring" };
于 2019-08-05T09:06:30.743 に答える