类型关键字

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. }