type interface

接口和类型别名都可以用来描述对象的形状或函数签名:

  1. interface Point {
  2. x: number;
  3. y: number;
  4. }
  5. interface setPoint {
  6. (x: number, y: number): void
  7. }
  8. type tPoint = {
  9. x: number,
  10. y: number
  11. }
  12. type tSetPoint = (x: number, y: number) => void

与接口类型不一样,类型别名可以用于一些其他类型,比如原始类型、联合类型和元组

  1. // primitive
  2. type Name = string;
  3. // object
  4. type PartialPointX = { x: number; };
  5. type PartialPointY = { y: number; };
  6. // union
  7. type PartialPoint = PartialPointX | PartialPointY;
  8. // tuple
  9. type Data = [number, string];

接口和类型别名都能够被扩展,但语法有所不同。此外,接口和类型别名不是互斥的。接口可以扩展类型别名,而反过来是不行的。

  1. interface PartialPointX { x: number; }
  2. interface Point extends PartialPointX {
  3. y: number;
  4. }
  1. type PartialPointX = { x: number; };
  2. type Point = PartialPointX & { y: number; };
  1. type PartialPointX = { x: number; };
  2. interface Point extends PartialPointX { y: number; }
  1. interface PartialPointX { x: number; }
  2. type Point = PartialPointX & { y: number; };

类可以以相同的方式实现接口或类型别名,但类不能实现使用类型别名定义的联合类型:

  1. interface Point {
  2. x: number;
  3. y: number;
  4. }
  5. class SomePoint implements Point {
  6. x = 1;
  7. y = 2;
  8. }
  9. type Point2 = {
  10. x: number;
  11. y: number;
  12. };
  13. class SomePoint2 implements Point2 {
  14. x = 1;
  15. y = 2;
  16. }
  17. type PartialPoint = { x: number; } | { y: number; };
  18. // A class can only implement an object type or
  19. // intersection of object types with statically known members.
  20. class SomePartialPoint implements PartialPoint { // Error
  21. x = 1;
  22. y = 2;
  23. }

与类型别名不同,接口可以定义多次,会被自动合并为单个接口。

  1. interface Point { x: number; }
  2. interface Point { y: number; }
  3. const point: Point = { x: 1, y: 2 };