タイプ機能
関数の宣言
:関数宣言(関数宣言)発現および機能(関数式) - JavaScriptでは、関数を定義した2つの一般的な方法があります
// 函数声明(Function Declaration)
function sum(x, y) {
return x + y;
}
// 函数表达式(Function Expression)
let mySum = function (x, y) {
return x + y;
};
関数の入力と出力は、活字体制約的には、関数型定義文は、比較的単純であり、アカウントに入力と出力の両方を取ることが必要です。
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.
関数式
我々は今、関数式(関数式)の定義を書きたい場合は次のように書くことができます。
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;
};
活字体混同しないように注意してください=>
にしてES6を=>
。
活字体の型の定義は、=>
関数定義を表すために使用される、左入力タイプは、右出力タイプであり、必要な括弧です。
ES6では、=>
矢印の関数を呼び出し、[] [ES6矢印関数]を参照することができ、広く使用されています。
インタフェース定義された関数の形状
また、インタフェースを使用した行の関数の形状を定義する必要があります。
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
return source.search(subString) !== -1;
}
オプションのパラメータ
先に述べたように、パラメータ(必須以下)余分な入力は、許可されていません。それでは、どのようにオプションのパラメータを定義していますか?
同様のオプションの属性インタフェースは、我々は、?
オプションの引数を表します:
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.
パラメータデフォルト
ES6では、我々は関数のパラメータは、デフォルト値を追加することができ、オプションのパラメータのデフォルト値を識別するためのパラメータを追加しますtypescriptです。
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');
デフォルトパラメータについて、参照は[] [関数パラメータのES6デフォルト値]であってもよいです。
残りのパラメータ
ES6を用いることができる...rest
。実施形態は、残りのパラメータ(残りパラメータ)の関数を取得します
function push(array, ...items) {
items.forEach(function(item) {
array.push(item);
});
}
let a = [];
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);
[] [残りはES6パラメータ]を参照して、残りのパラメータはパラメータだけの最後の引数、休息することができ、注意してください。
オーバーロード
過負荷場合関数は異なる処理にパラメータの異なる数またはタイプを受け入れることを可能にします。
例えば、我々は、機能を実装する必要があるreverse
番号を入力し、123
ときに反転デジタル出力321
、入力文字列'hello'
出力が文字列を逆転させました'olleh'
。
共同タイプの使用は、私たちは達成することができます:
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
しかし、これは正確に表現できないという欠点、デジタル入力を有し、出力数、文字列入力であるべきで、出力が文字列でなければなりません。
現時点では、複数のオーバーロードされた定義に使用できるreverse
機能の種類を:
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
上記の例では、我々はリピート機能の数を定義reverse
、以前のすべての関数定義を、最後の実装の関数です。エディタでコードヒントは、あなたが正しい最初の二つのヒントを見ることができます。
注、活字体が正面から試合定義関数を起動を優先させて頂きますので、あなたが複数の関数定義された包含関係を持っている場合、あなたは正確な定義の社説を優先する必要があります。
- この記事では、を意味しxcatliu