Skip to content

接口

一个接口声明是另一种方式来命名对象类型:

typescript
interface Point { 
  x: number; 
  y: number; 
}

function printCoord(pt: Point) { 
  console.log("坐标x的值是: " + pt.x); 
  console.log("坐标y的值是: " + pt.y); 
}

printCoord({ x: 100, y: 100 });

就像我们在上面使用类型别名时一样,该示例就像我们使用了匿名对象类型一样工作。TypeScript 只关心我们传递给的值的结构 printCoord ——它只关心它是否具有预期的属性。只关心类型的结构和功能,是我们将 TypeScript 称为结构类型类型系统的原因。 类型别名和接口之间的差异 类型别名和接口非常相似,在很多情况下你可以自由选择它们。几乎所有的功能都在 interface 中可用 type ,关键区别在于扩展新类型的方式不同:

typescript
// 扩展接口 
interface Animal { 
  name: string 
}

interface Bear extends Animal { 
  honey: boolean 
}

const bear: Bear = { 
  name: 'winnie', 
  honey: true 
}
bear.name 
bear.honey
typescript
// 通过交叉点扩展类型 
type Animal = { 
  name: string 
}

type Bear = Animal & { 
  honey: boolean 
}

const bear: Bear = { 
  name: 'winnie', 
  honey: true 
}
bear.name; 
bear.honey;
typescript
// 向现有接口添加新字段 
interface MyWindow { 
  title: string 
}

interface MyWindow { 
  count: number 
}

const w: MyWindow = { 
  title: 'hello ts', 
  count: 100 
}
typescript
// 类型创建后不可更改 
type MyWindow = { 
  title: string 
}

type MyWindow = { 
  count: number 
}
  • 在 TypeScript 4.2 版之前,类型别名可能出现在错误消息中,有时会代替等效的匿名类型 (这可能是可取的,也可能是不可取的)。接口将始终在错误消息中命名。
  • 类型别名可能不参与声明合并,但接口可以。
  • 接口只能用于声明对象的形状,不能重命名基元。
  • 接口名称将始终以其原始形式出现在错误消息中,但仅当它们按名称使用时。

大多数情况下,你可以根据个人喜好进行选择,TypeScript 会告诉你是否需要其他类型的声明。 如果您想要启发式,请使用 interface ,然后在需要时使用 type 。