• 类型关键字
    • 联合类型
    • 交叉类型
    • 函数类型定义

    类型关键字

    type关键字定义类型的别名。

    1. type str = string;
    2. let cheese: str = 'gorgonzola';
    3. let cake: str = 10; // Type 'number' is not assignable to type 'string'

    乍一看,这似乎并不是非常有用(即使是错误提及原始类型),但随着类型注释变得更加复杂,type 关键字的好处变得明显。

    联合类型

    联合类型允许类型注释指定属性应该是一组类型之一(两者任一)。

    1. function admitAge (age: number|string): string {
    2. return `I am ${age}, alright?!`;
    3. }
    4. admitAge(30); // 'I am 30, alright?!'
    5. admitAge('Forty'); // 'I am Forty, alright?!'

    type关键字简化了注释和重用联合类型。

    1. type Age = number | string;
    2. function admitAge (age: Age): string {
    3. return `I am ${age}, alright?!`;
    4. }
    5. let myAge: Age = 50;
    6. let yourAge: Age = 'One Hundred';
    7. admitAge(yourAge); // 'I am One Hundred, alright?!'

    联合类型的字符串文字类型是一个非常有用的模式,创建基本上是带有字符串值的枚举。

    1. type PartyZone = "pizza hut" | "waterpark" | "bowling alley" | "abandoned warehouse";
    2. function goToParty (place: PartyZone): string {
    3. return `lets go to the ${place}`;
    4. }
    5. goToParty("pizza hut");
    6. goToParty("chuck e. cheese"); // Argument of type `"chuck e. cheese"' is not assignable to parameter of type 'PartyZone'

    交叉类型

    交叉类型是两种或更多种类型的组合。 适用于需要实现多个接口的对象和参数。

    1. interface Kicker {
    2. kick(speed: number): number;
    3. }
    4. interface Puncher {
    5. punch(power: number): number;
    6. }
    7. // assign intersection type definition to alias KickPuncher
    8. type KickPuncher = Kicker & Puncher;
    9. function attack (warrior: KickPuncher) {
    10. warrior.kick(102);
    11. warrior.punch(412);
    12. warrior.judoChop(); // Property 'judoChop' does not exist on type 'KickPuncher'
    13. }

    函数类型定义

    函数类型注释可以比内置函数类型的typescript更加具体。 Function类型定义允许您将函数签名附加到它自己的类型。

    1. type MaybeError = Error | null;
    2. type Callback = (err: MaybeError, response: Object) => void;
    3. function sendRequest (cb: Callback): void {
    4. if (cb) {
    5. cb(null, {});
    6. }
    7. }

    语法与ES6 fat-arrow函数类似。([params]) => [return type].

    前面为了说明类型关键字而提高了代码片段的可读性,这里是定义为inline的函数类型。

    1. function sendRequest (cb: (err: Error|null, response: Object) => void): void {
    2. if (cb) {
    3. cb(null, {});
    4. }
    5. }