# Interfaces vs Types in TypeScript ###### tags: `Javascript, React, Typescript` TLDR; My personal convention, which I describe below, is this: Always prefer interface over type. When to use type: * Use type when defining an alias for primitive types (string, boolean, number, bigint, symbol, etc) * Use type when defining tuple types * Use type when defining function types(這部分 interface 也可以做到但是 type 比較好讀) * Use type when defining a union * Use type when trying to overload functions in object types via composition * Use type when needing to take advantage of mapped types When to use interface: * Use interface for all object types where using type is not required (see above) * Use interface when you want to take advantage of declaration merging. 雖然人家直接推薦使用 interface 但還是看下 type alias 以及 interface 兩者的差異 ## 1. Objects / Functions 兩者都可以使用在物件以及函式上面,不過會有語法上面的不同 ```typescript= // 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; ``` ## 2. Other Types 這邊只有 type 可以做到的操作像是為 primitive 設立 type ,針對 union 作 type ,以及 tuple 設立 type (tuple 代表陣列中的 type 不唯一可能有各種 type 在內 ![](https://i.imgur.com/d1ouCCO.png) ) ```typescript= // primitive type Name = string; // object type PartialPointX = { x: number; }; type PartialPointY = { y: number; }; // union type PartialPoint = PartialPointX | PartialPointY; // tuple type Data = [number, string]; ``` ## 3. Extend 一樣兩種方式都可以做到 extend 不過是語法上有差異,並且兩者可以 extend 對方 ```typescript= Interface extends interface interface PartialPointX { x: number; } interface Point extends PartialPointX { y: number; } Type alias extends type alias type PartialPointX = { x: number; }; type Point = PartialPointX & { y: number; }; 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 & { y: number; }; ``` ## 4. Implements Implements 是 typescpirt 的關鍵字,基本上兩者的操作方式差不多,不過 type 的 union 不能使用 implements ```typescript= 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; }; // FIXME: can not implement a union type class SomePartialPoint implements PartialPoint { x = 1; y = 2; } ``` ## 5. Declaration merging interface 可以重複 delaration 的行為,type 不行 ```typescript= // These two declarations become: // interface Point { x: number; y: number; } interface Point { x: number; } interface Point { y: number; } const point: Point = { x: 1, y: 2 }; ```