// 使用type定义一个类型 type Person = { name: string; age: number; } // 使用interface定义一个类型 interface Animal { name: string; age: number; } // 使用type定义一个函数签名 type Add = (a: number, b: number) => number; // 使用interface定义一个函数签名 interface Subtract { (a: number, b: number): number; } // 使用type定义一个泛型 type Container<T> = { value: T; } // 使用interface定义一个泛型 interface Box<T> { value: T; } // 使用type进行类型别名 type Score = number; type Name = string; // interface是一个合并类型,可以多次声明同一个接口 interface User { name: string; } interface User { age: number; } // type不是合并类型,如果重复定义会报错 type Person = { name: string; } type Person = { age: number; } // 报错!重复定义 // type可以使用联合类型和交叉类型 type A = string | number; type B = { name: string } & { age: number };
type 和 interface 在绝大多数情况下可以互换使用,都能够定义对象类型、函数类型、泛型类型等。不过有一些微小的差别:
- interface在声明合并时,会将同名属性进行合并,而type会报错。
- type可以使用联合类型和交叉类型,而interface不能直接使用。
- type可以为基本类型(如number、string等)定义类型别名,interface不可以。
- 当定义类型别名时,使用type更为直观;当定义对象类型时,使用interface更为直观。
一般来说,如果你不确定该使用type还是interface,可以优先选择interface,因为它在使用上更加直观,并且可以方便地声明合并。