オブジェクトのタイプ - インターフェイス
活字体では、我々は、オブジェクトを定義するためのインタフェース(インタフェース)のタイプを使用します。
インターフェースは何ですか
オブジェクト指向言語では、インタフェース(インタフェース)は、それが抽象的動作であり、どのように特定のアクションは、(実装)クラス(クラス)で実装する必要があり、非常に重要な概念です。
インタフェースを活字体に加えて用いることができる非常に柔軟な概念である抽象クラスの挙動の一部に外、それはまた、多くの場合、「形状(形状)オブジェクト」の説明に使用されます。
簡単な例
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
上記の例では、インターフェイスを定義Person
し、その変数定義しtom
、そのタイプPerson
。したがって、我々は制約tom
界面の形状をしてでなければならないPerson
一貫性のあります。
インターフェースは、一般的に資産計上されます。インターフェイスといくつかのプログラミング言語の名前を追加することを示唆しているI
接頭辞を。
以下の特性のいくつかよりも変数の定義されたインタフェースが許可されていません。
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom'
};
// index.ts(6,5): error TS2322: Type '{ name: string; }' is not assignable to type 'Person'.
// Property 'age' is missing in type '{ name: string; }'.
いくつかのマルチ属性が許可されていません。
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
// index.ts(9,5): error TS2322: Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.
// Object literal may only specify known properties, and 'gender' does not exist in type 'Person'.
可視、割り当てられた場合、変数の形状と界面の形状が一致していなければなりません。
オプションの属性
時々、私たちは、あなたが任意の属性を使用することができ、完全に形状を一致させる必要はありません。
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom'
};
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
プロパティが存在しない可能性があることを意味オプションの属性。
そして、まだ未定義のプロパティを追加することはできません。
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
// examples/playground/index.ts(9,5): error TS2322: Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.
// Object literal may only specify known properties, and 'gender' does not exist in type 'Person'.
任意のプロパティ
時々、私たちは、あなたが、次の方法を使用することができ、任意の属性を可能にするインターフェイスをしたいです:
interface Person {
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
使用する[propName: string]
任意の属性がかかる定義string
値型を。
なお、定義された属性のいずれかの特性を決定し、オプション属性のタイプは、そのタイプのサブセットでなければならない一度。
interface Person {
name: string;
age?: number;
[propName: string]: string;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
// index.ts(3,5): error TS2411: Property 'age' of type 'number' is not assignable to string index type 'string'.
// index.ts(7,5): error TS2322: Type '{ [x: string]: string | number; name: string; age: number; gender: string; }' is not assignable to type 'Person'.
// Index signatures are incompatible.
// Type 'string | number' is not assignable to type 'string'.
// Type 'number' is not assignable to type 'string'.
実施形態では、値は任意のプロパティであることを許容string
するが、任意の属性age
値であるnumber
、number
ないstring
サブプロパティ、そうエラー。
また、その場合には、エラーメッセージ、に見られる{ name: 'Tom', age: 25, gender: 'male' }
タイプになる推測される{ [x: string]: string | number; name: string; age: number; gender: string; }
タイプとの接合界面の組み合わせです。
読み取り専用属性
時々 、私たちは、あなたがすることができ、いくつかのフィールドにオブジェクトのみ作成時に割り当てることができますたいreadonly
読み取り専用属性を定義します。
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
id: 89757,
name: 'Tom',
gender: 'male'
};
tom.id = 9527;
// index.ts(14,5): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.
実施形態では、使用してreadonly
属性の定義をid
初期化した後にすると、エラーので、割り当てられています。
その読み取り専用の制約は、オブジェクトへの最初の割り当てに存在であることに注意してください、ないとき、読み取り専用属性の割り当てに初めて:
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
tom.id = 89757;
// index.ts(8,5): error TS2322: Type '{ name: string; gender: string; }' is not assignable to type 'Person'.
// Property 'id' is missing in type '{ name: string; gender: string; }'.
// index.ts(13,5): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.
実施形態では、第一、そのであり、2つのエラーメッセージが存在するtom
しないように、割り当ての時間id
割り当てます。
第二に与えられtom.id
、それが読み取り専用であるため、属性、そのエラーを、時間の割り当てを。
- この記事では、を意味しxcatliu