interface是真正的类型,type只是类型别名
inteface 遇到属性冲突会报错, type只会合并,遇到属性冲突会变成never类型
所以导致interface会”惰性求值”,而type会直接展开
type Wrapped
typescript源码
getDeclaredTypeOfClassOrInterface
核心在这里: links.declaredType存在时,直接返回 links.declaredType
function getDeclaredTypeOfClassOrInterface(symbol: Symbol): InterfaceType {
let links = getSymbolLinks(symbol);
const originalLinks = links;
if (!links.declaredType) {
const kind = symbol.flags & SymbolFlags.Class ? ObjectFlags.Class : ObjectFlags.Interface;
// ....
}
return links.declaredType as InterfaceType;
}
对于type会尝试立即解析 getDeclaredTypeOfTypeAlias