TypeScript类型作为集合

https://www.staging-typescript.org/docs/handbook/typescript-in-5-minutes-oop.html

google translate

类型作为集合

在 C# 或 Java 中,考虑运行时类型与其编译时声明之间的一一对应关系是有意义的。

在 TypeScript 中,最好将类型视为一组具有共同点的值因为类型只是集合,一个特定的值可以同时属于多个集合。

一旦您开始将类型视为集合,某些操作就会变得非常自然。例如,在C#中,这是尴尬绕过一个值,或者一个stringint,因为没有一个单一的类型,表示这种价值。

在 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因为它的xy属性都是数字。类型之间的关系由它们包含的属性决定,而不是它们是否以某种特定关系声明

TypeScript 的类型系统也没有具体化:在运行时没有任何东西可以告诉我们objPointlike事实上,该Pointlike类型在运行时以任何形式存在

回到将类型作为集合的想法,我们可以将其obj视为PointlikeNamed集和值集的成员。

posted @ 2021-10-21 11:16  悠哉大斌  阅读(237)  评论(0编辑  收藏  举报