https://www.staging-typescript.org/docs/handbook/typescript-in-5-minutes-oop.html
google translate
类型作为集合
在 C# 或 Java 中,考虑运行时类型与其编译时声明之间的一一对应关系是有意义的。
在 TypeScript 中,最好将类型视为一组具有共同点的值。因为类型只是集合,一个特定的值可以同时属于多个集合。
一旦您开始将类型视为集合,某些操作就会变得非常自然。例如,在C#中,这是尴尬绕过一个值,或者一个string
或int
,因为没有一个单一的类型,表示这种价值。
在 TypeScript 中,一旦您意识到每种类型都只是一个集合,这就变得很自然了。您如何描述属于string
集合或number
集合的值?它只是属于这些集合的并集:string | number
。
TypeScript 提供了许多以集合论方式处理类型的机制,如果您将类型视为集合,您会发现它们更直观。
擦除的结构类型
在 TypeScript 中,对象不是单一的精确类型。例如,如果我们构造一个满足接口的对象,即使两者之间没有声明关系,我们也可以在需要该接口的地方使用该对象。
interface Pointlike {
x: number;
y: number;
}
interface Named {
name: string;
}
function logPoint(point: Pointlike) {
console.log("x = " + point.x + ", y = " + point.y);
}
function logName(x: Named) {
console.log("Hello, " + x.name);
}
const obj = {
x: 0,
y: 0,
name: "Origin",
};
logPoint(obj);
logName(obj);
尝试TypeScript 的类型系统是结构性的,而不是名义上的:我们可以将其obj
用作 a,Pointlike
因为它的x
和y
属性都是数字。类型之间的关系由它们包含的属性决定,而不是它们是否以某种特定关系声明。
TypeScript 的类型系统也没有具体化:在运行时没有任何东西可以告诉我们obj
是Pointlike
. 事实上,该Pointlike
类型在运行时不以任何形式存在。
回到将类型作为集合的想法,我们可以将其obj
视为Pointlike
值Named
集和值集的成员。