Typeescript知識点まとめの対象タイプインターフェース、配列タイプ、関数タイプ
9323 ワード
一. Type Scriptでは、オブジェクトのタイプをインターフェース(Interfaces)で定義します.
2. インターフェースとは何ですか
オブジェクト指向言語では、インターフェース(Interfaces)は行動に対する抽象的な概念であり、具体的にどのように行動するかはクラス(clases)によって実現される必要があります.
Type Scriptにおけるインターフェースは非常に柔軟な概念であり、クラスの一部の行為を抽象化するために使用できるほか、「オブジェクトの形状(Shape)」についてもよく説明する.
簡単な例
時には形に完全にマッチしないことを希望します.オプションの属性を使えばいいです.
私たちはインターフェースが任意の属性を持つことができることを望んでいます.
また、エラーメッセージで確認できます.
注意:一つのインターフェースでは任意の属性しか定義できません.インターフェースに複数のタイプの属性がある場合は、任意の属性に結合タイプを使用することができます.
オブジェクトの中の一部のフィールドは作成時にのみ割り当てられます.
読み取り専用の制約は、最初にオブジェクトに値を割り当てたときではなく、読み取り専用属性に初めて値を割り当てたときに存在します.
二番目: 配列の種類
1.表示法
最も簡単な方法は、配列を「タイプ+四角い括弧」で表すことです.
2.配列汎型
配列汎型(Aray Generac)も使用できます.
インターフェースは配列を記述するためにも使用できます.
インターフェースは配列を記述するためにも使用できますが、この方法は前の2つの方法より複雑です.
ただし、例外的にクラス配列を表す場合によく使われます.
4.クラス配列
クラス配列(Aray-like Object)は配列タイプではありません.
実際によく使われているクラスの配列は、自分のインターフェース定義があります.
1. 関数宣言
JavaScriptには、関数宣言(Function Declaration)と関数式(Function Expression)の2つの一般的な定義関数があります.
関数式(Function Expression)の定義を書くと、次のようになります.
ES 6において、
3. 関数の形状をインターフェースで定義します.
また、インタフェースの方式を使って、関数を定義するには、適合する形が必要です.
4.オプションパラメータ
前に述べたように、必要以上の(または必要以上の)パラメータを入力することは許されません.オプションのパラメータはどう定義しますか?
インターフェースのオプション属性と似ています.
ES 6では、関数のパラメータにデフォルト値を追加することができます.Type Scriptはデフォルト値を追加したパラメータをオプションパラメータとして識別します.
ES 6で使用できます.
7. 再読み込み
……
2. インターフェースとは何ですか
オブジェクト指向言語では、インターフェース(Interfaces)は行動に対する抽象的な概念であり、具体的にどのように行動するかはクラス(clases)によって実現される必要があります.
Type Scriptにおけるインターフェースは非常に柔軟な概念であり、クラスの一部の行為を抽象化するために使用できるほか、「オブジェクトの形状(Shape)」についてもよく説明する.
簡単な例
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
// :
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'.
3.オプション属性時には形に完全にマッチしないことを希望します.オプションの属性を使えばいいです.
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom'
};
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
4.任意の属性私たちはインターフェースが任意の属性を持つことができることを望んでいます.
interface Person {
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
任意の属性が定義されると、属性とオプションの属性を決定するタイプは、そのタイプのサブセットでなければならないことに留意されたい.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; }
、これは結合タイプとインターフェースの結合である.注意:一つのインターフェースでは任意の属性しか定義できません.インターフェースに複数のタイプの属性がある場合は、任意の属性に結合タイプを使用することができます.
interface Person {
name: string;
age?: number;
[propName: string]: string | number;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
5.読み取り専用属性オブジェクトの中の一部のフィールドは作成時にのみ割り当てられます.
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
初期化後、また割り当てられましたので、エラーが発生しました.読み取り専用の制約は、最初にオブジェクトに値を割り当てたときではなく、読み取り専用属性に初めて値を割り当てたときに存在します.
二番目: 配列の種類
1.表示法
最も簡単な方法は、配列を「タイプ+四角い括弧」で表すことです.
2.配列汎型
配列汎型(Aray Generac)も使用できます.
Array
を選択しますlet fibonacci: Array = [1, 1, 2, 3, 5];
3.配列をインターフェースで表すインターフェースは配列を記述するためにも使用できます.
interface NumberArray {
[index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];
NumberArray
索引の種類が数値の場合、値の種類は数値でなければなりません.インターフェースは配列を記述するためにも使用できますが、この方法は前の2つの方法より複雑です.
ただし、例外的にクラス配列を表す場合によく使われます.
4.クラス配列
クラス配列(Aray-like Object)は配列タイプではありません.
arguments
:function sum() {
let args: number[] = arguments;
}
// Type 'IArguments' is missing the following properties from type 'number[]': pop, push, concat, join, and 24 more.
上記の例では、arguments
実際にはクラスの配列です.普通の配列では説明できませんが、インターフェースを使うべきです.function sum() {
let args: {
[index: number]: number;
length: number;
callee: Function;
} = arguments;
}
この例では、インデックスの種類が数値である場合には、値の種類は数値でなければならないという制約以外に、またそれを制約している. length
和 callee
二つの属性実際によく使われているクラスの配列は、自分のインターフェース定義があります.
IArguments
、 NodeList
、 HTMLCollection
など:function sum() {
let args: IArguments = arguments;
}
そのうち IArguments
Type Scriptで定義されているタイプです.interface IArguments {
[index: number]: any;
length: number;
callee: Function;
}
三、関数の種類1. 関数宣言
JavaScriptには、関数宣言(Function Declaration)と関数式(Function Expression)の2つの一般的な定義関数があります.
// (Function Declaration)
function sum(x, y) {
return x + y;
}
// (Function Expression)
let mySum = function (x, y) {
return x + y;
};
一つの関数には入力と出力があり、Type Scriptでそれを制約するためには、入力と出力を考慮しなければならない.関数宣言のタイプ定義は簡単である.function sum(x: number, y: number): number {
return x + y;
}
なお、必要以上の(または必要以上の)パラメータを入力することは許可されていません.function sum(x: number, y: number): number {
return x + y;
}
sum(1, 2, 3);
// index.ts(4,1): error TS2346: Supplied parameters do not match any signature of call target.
function sum(x: number, y: number): number {
return x + y;
}
sum(1);
// index.ts(4,1): error TS2346: Supplied parameters do not match any signature of call target.
2. 関数式関数式(Function Expression)の定義を書くと、次のようになります.
let mySum = function (x: number, y: number): number {
return x + y;
};
これはコンパイルによるものですが、上のコードは等号の右側の匿名関数のみをタイプ定義しています. mySum
は、値付け動作によるタイプ推論から推論される.必要ならば私達は手であげます. mySum
タイプを追加すると、このようになるべきです.let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y;
};
Type Scriptの中のものを間違えないように注意してください. =>
とES 6の中の =>
Type Scriptのタイプ定義において、=>
関数の定義を表します.左は入力タイプで、括弧で囲む必要があります.右は出力タイプです.ES 6において、
=>
矢印関数と呼ばれています.3. 関数の形状をインターフェースで定義します.
また、インタフェースの方式を使って、関数を定義するには、適合する形が必要です.
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
return source.search(subString) !== -1;
}
関数式|インターフェースで関数を定義する方式を採用すると、等号の左側にタイプ制限があり、今後関数名を付与する際にパラメータの個数、パラメータの種類、戻り値の種類が不変であることを保証できます.4.オプションパラメータ
前に述べたように、必要以上の(または必要以上の)パラメータを入力することは許されません.オプションのパラメータはどう定義しますか?
インターフェースのオプション属性と似ています.
?
オプションのパラメータを表します.function buildName(firstName: string, lastName?: string) {
if (lastName) {
return firstName + ' ' + lastName;
} else {
return firstName;
}
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');
なお、オプションパラメータは必要なパラメータの後ろに接続してください.言い換えれば、オプションパラメータの後に必要なパラメータが再び出現することは許されません.function buildName(firstName?: string, lastName: string) {
if (firstName) {
return firstName + ' ' + lastName;
} else {
return lastName;
}
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName(undefined, 'Tom');
// index.ts(1,40): error TS1016: A required parameter cannot follow an optional parameter.
5. パラメータのデフォルト値ES 6では、関数のパラメータにデフォルト値を追加することができます.Type Scriptはデフォルト値を追加したパラメータをオプションパラメータとして識別します.
function buildName(firstName: string, lastName: string = 'Cat') {
return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');
この場合は「オプションパラメータは必要なパラメータの後ろに接続しなければならない」という制限を受けません.function buildName(firstName: string = 'Tom', lastName: string) {
return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let cat = buildName(undefined, 'Cat');
6.残りのパラメータES 6で使用できます.
...rest
の方法で関数の残りのパラメータを取得します.function push(array, ...items) {
items.forEach(function(item) {
array.push(item);
});
}
let a: any[] = [];
push(a, 1, 2, 3);
実は、items
は、行列です.行列の種類で定義できます.function push(array: any[], ...items: any[]) {
items.forEach(function(item) {
array.push(item);
});
}
let a = [];
push(a, 1, 2, 3);
なお、restパラメータは最後のパラメータしかありません.7. 再読み込み
……