类型别名:用 type 来给一种类型起个别名,常用于联合类型
type Name = string; type NameResolver = () => string; type NameOrResolver = Name | NameResolver; function getName(n: NameOrResolver): Name { if (typeof n === 'string') { return n; } else { return n(); } }
接口与类型别名的区别 :
实际上,在大多数的情况下使用接口类型和类型别名的效果等价,但是在某些特定的场景下这两者还是 存在很大区别。
TypeScript 的核心原则之一是对值所具有的结构进行类型检查。 而接口的作用就是为这些类型命 名和为你的代码或第三方代码定义数据模型。 type(类型别名)会给一个类型起个新名字。 type 有时和 interface 很像,但是可以作用于原始值 (基本类型),联合类型,元组以及其它任何你需要手写的类型。起别名不会新建一个类型 - 它创 建了一个新 名字来引用那个类型。给基本类型起别名通常没什么用,尽管可以做为文档的一种形 式使用
Objects / Functions:两者都可以用来描述对象或函数的类型,但是语法不同。
Interface :
interface Point { x: number; y: number; } interface SetPoint { (x: number, y: number): void; }
Type alias :
type Point = { x: number; y: number; }; type SetPoint = (x: number, y: number) => void;
Other Types :与接口不同,类型别名还可以用于其他类型,如基本类型(原始值)、联合类型、元组
// primitive type Name = string; // object type PartialPointX = { x: number; }; type PartialPointY = { y: number; }; // union type PartialPoint = PartialPointX | PartialPointY; // tuple type Data = [number, string]; // dom let div = document.createElement('div'); type B = typeof div;
接口可以定义多次,类型别名不可以
interface Point { x: number; } interface Point { y: number; } const point: Point = { x: 1, y: 2 };