interface 和 type 的区别
声明合并
interface会做声明合并,将同变量名的合并,导致其声明的类型具有不确定性。会造成比如,将这个类型的变量赋值给Record<string, string>、{[x: string], string}类型变量时,会报类型错误,解决方法是给interface加上索引签名{[x: string], string}。
但type不做声明合并, 所以是没有问题的。
ts
interface user {
name: string;
}
interface user {
breed: string;
// {[x: string], string}
}
type user2 = {
name: string;
};
const person: user = {
name: "Andi",
age: 18,
};
const person2: user2 = {
name: "Andi",
};
let person3: Record<string, string>;
person3 = person; // 报类型错误
person32 = person; // 没问题类型拓展
interface使用extends实现,type通过&交叉运算符形成交叉类型
ts
interface userExtends {
breed: string;
}
interface user extends userExtends {
name: string;
}
type user2Extends = {
breed: string;
};
type user2 = user2Extends & {
name: string;
};
JStar