暮年|细数这些年被困扰过的 TS 问题( 五 )


继续阅读:是时候表演真正的技术了 - TS 分身之术
六、interfaces 与 type 之间有什么区别6.1 Objects/Functions接口和类型别名都可以用来描述对象的形状或函数签名:
接口
interface Point {x: number;y: number;}interface SetPoint {(x: number, y: number): void;}类型别名
type Point = {x: number;y: number;};type SetPoint = (x: number, y: number) => void;6.2 Other Types与接口类型不一样 , 类型别名可以用于一些其他类型 , 比如原始类型、联合类型和元组:
// primitivetype Name = string;// objecttype PartialPointX = { x: number; };type PartialPointY = { y: number; };// uniontype PartialPoint = PartialPointX | PartialPointY;// tupletype Data = http://kandian.youth.cn/index/[number, string];6.3 Extend接口和类型别名都能够被扩展 , 但语法有所不同 。 此外 , 接口和类型别名不是互斥的 。 接口可以扩展类型别名 , 而反过来是不行的 。
Interface extends interface
【暮年|细数这些年被困扰过的 TS 问题】interface PartialPointX { x: number; }interface Point extends PartialPointX {y: number; }Type alias extends type alias
type PartialPointX = { x: number; };type Point = PartialPointX};Interface extends type alias
type PartialPointX = { x: number; };interface Point extends PartialPointX { y: number; }Type alias extends interface
interface PartialPointX { x: number; }type Point = PartialPointX};6.4 Implements类可以以相同的方式实现接口或类型别名 , 但类不能实现使用类型别名定义的联合类型:
interface Point {x: number;y: number;}class SomePoint implements Point {x = 1;y = 2;}type Point2 = {x: number;y: number;};class SomePoint2 implements Point2 {x = 1;y = 2;}type PartialPoint = { x: number; } | { y: number; };// A class can only implement an object type or // intersection of object types with statically known members.class SomePartialPoint implements PartialPoint { // Errorx = 1;y = 2;}6.5 Declaration merging与类型别名不同 , 接口可以定义多次 , 会被自动合并为单个接口 。
interface Point { x: number; }interface Point { y: number; }const point: Point = { x: 1, y: 2 };七、object, Object 和 {} 之间有什么区别7.1 object 类型object 类型是:TypeScript 2.2 引入的新类型 , 它用于表示非原始类型 。
// node_modules/typescript/lib/lib.es5.d.tsinterface ObjectConstructor {create(o: object | null): any;// ...}const proto = {};Object.create(proto);// OKObject.create(null);// OKObject.create(undefined); // ErrorObject.create(1337);// ErrorObject.create(true);// ErrorObject.create("oops");// Error7.2 Object 类型Object 类型:它是所有 Object 类的实例的类型 , 它由以下两个接口来定义:

  • Object 接口定义了 Object.prototype 原型对象上的属性;
// node_modules/typescript/lib/lib.es5.d.tsinterface Object {constructor: Function;toString(): string;toLocaleString(): string;valueOf(): Object;hasOwnProperty(v: PropertyKey): boolean;isPrototypeOf(v: Object): boolean;propertyIsEnumerable(v: PropertyKey): boolean;}