演算子を使用したタイプの定義


Union Type(Union Type)

// main.ts
function log(value: string): void {
    console.log(value);
}

log('string'); // -> O
log(10); // -> X
log関数はstringタイプのパラメータのみをパラメータとして渡すことができます.上記のコードでnumber type 10を呼び出すとエラーが表示されます.
この問題を解決するには、stringではなくvalueパラメータに任意のタイプを指定することで、この問題を解決できます.しかしtypescriptを使用することは何の意味もないため,より現実的な解決策を使用する必要がある.
タイプを指定する場合、|演算子を使用して、異なるタイプの値を指定できます.
// main.ts
function log(value: string | number): void {
    console.log(value);
}

log('string');  // -> O
log(10);  // -> O
|演算子を使用すると、valueパラメータは文字列または数値タイプの値を渡すことができます.このタイプは유니온 타입(Union Type)と呼ばれます.
すなわち、1つまたは複数の特定のタイプの可用性を汎用タイプと呼ぶ.

Unionタイプのメリット



上図では、log関数のパラメータvalueは、stringおよびnumberタイプの値を受信できるUnionタイプを指定します.
関数内で、if文を介して値変数がnumberタイプである場合、if文コードブロック内のvalue変数のタイプ推定によりnumberタイプの使用可能なメソッドまたはプロファイルを図として表示できます.

Elseコードブロックは、タイプ推定によってvalue変数が持つ残りのタイプがstringであることを可能にするため、stringタイプに関連する方法および基本情報を表示する.
if条件文を使用してタイプを推定する操作を「タイプ保護」と呼びます.タイプ保護は、タイプ範囲を特定のタイプに縮小(フィルタ)するプロセスです.

Unionタイプのフィーチャー

// main.ts
interface Developer {
    name: string;
    skill: string;
}

interface Person {
    name: string;
    age: number;
}

function askSomeone(someone: Developer | Person): void {
    someone.name; // -> O
    someone.skill;  // -> X
    someone.age;  // -> X
};
askSomeone関数のあるパラメータは開発者インタフェースとPersonインタフェースタイプに割り当てることができるUnionタイプである.
askSomeone関数で誰かのパラメータを参照する場合、誰かのパラメータがどのインタフェースタイプの値に割り当てられるか分からないため、「参照が確定していることを確認する」しかありません.
上記のコードは、「誰か」という変数がnameというpropertyを有することを保証するので、この変数を参照することができる.非スキルまたはage Propertyの場合は、参照時にエラーが表示されます.これは、「はい」または「いいえ」のいずれかです.

「誰か」パラメータは、「開発者」インタフェースと「Person」インタフェース「汎用」の「name Property」にのみアクセスできます.すなわち、インタフェースが汎用タイプとして使用される場合、関数にアクセスできるのは「保護されたタイプ(プロパティ)」のみです.どのタイプが渡されても、エラーが発生しない方向にタイプが推定されます.そうでない場合、他のPropertyでは無条件に取得できないため、エラーが表示されます.

Unionタイプの注意事項


somenパラメータは、開発者インタフェースまたはPersonインタフェースの1つの標準的なオブジェクトだけを渡すわけではないことに注意してください.つまり、askSomeone関数を呼び出す場合、パラメータが{ name: string; skill: string }{ name: string; age: number }のオブジェクトを渡す必要はありません.
あるパラメータは開発者とPersonインタフェースを同時に処理する汎用タイプであるため,askSomeone関数を呼び出すと,両方のタイプの属性が持つオブジェクトを渡すことができる.すなわち、オブジェクトの構成は{ name: string; skill: string, age: number }である.
つまり、askSomeone関数では、「保護されたタイプ(属性)にアクセスできるのは関数内のみ」というルールです.

断面タイプ


断面タイプの場合は、&演算子を使用します.断面タイプの場合、その動作は演算子andに似ています.すなわち、すべてのタイプが&演算子として接続された新しいタイプです.
// main.js
var user: string & number & boolen; // -> never
上記のコードでは、userは文字列、number、booleanタイプのいずれも満たさなければならないタイプであることがわかります.そのため、userはneverタイプで、下図に示すようにエラーが表示されます.


断面演算子をインタフェースとして使用する場合は、次の操作を行います.

AskSomeone関数のある人は、開発者インタフェースとPersonインタフェースがそれぞれ持つ「すべてのProperty」にアクセスできます.すなわち、パラメータは{ name: string; skill: string; age: number; }規格を有するオブジェクトを渡さなければならない.

さらに、あるパラメータで割り当てられたオブジェクトにはname、age、skillプロパティが同時に存在し、各プロパティには指定したタイプの値しか存在しない必要があります.すなわち,「インタフェース部分タイプ」を用いると,開発者とPersonインタフェースは「統合された新しいタイプ」と見なすことができる.