TypeScript仅与类型相关的属性?

时间:2019-08-23 21:46:37

标签: javascript typescript

我有这个TypeScript代码:

type MyType1 = {
    prop1: number,
    prop2: string,
    prop3: string
}
type MyType2 = {
    prop1: number,
    prop2: string
}
const objOfType1 = { prop1: 1, prop2: "hello world", prop3: "should be removed" } as MyType1;
console.log('objOfType1', objOfType1);

const objOfType2 = objOfType1 as MyType2;
console.log('objOfType2', objOfType2);

const objOfType2Copy = { ...objOfType2 };
console.log('objOfType2Copy', objOfType2Copy);

所有3种情况下的输出is the same

objOfType1,objOfType2和objOfType2Copy都具有相同的3个属性。我期望objOfType2和objOfType2Copy的输出都不会包含prop3属性。

如何实现“预期”行为?

1 个答案:

答案 0 :(得分:4)

您似乎误解了Typescript的工作方式。

Typescript是Javascript的超集。它提供了静态类型,可以在运行时之前检查您的代码并增强代码质量和易懂性。

Typescript 已编译为Javascript。所有特定于Typescript的代码均已从最终JS代码中删除:所有类型。您的浏览器无法运行Typescript代码,它将运行已编译的Javascript代码。

因此,您编译为JS的代码将提供以下信息:

const objOfType1 = { prop1: 1, prop2: "hello world", prop3: "should be removed" }
console.log('objOfType1', objOfType1);

const objOfType2 = objOfType1;
console.log('objOfType2', objOfType2);

const objOfType2Copy = { ...objOfType2 };
console.log('objOfType2Copy', objOfType2Copy);

如您所见,所有类型和对其的引用均被删除:仅保留JS部分。打字稿只是在这里构造您的代码,他是开发人员。

使用as关键字时,您只是告诉TS编译器“好吧,这个变量是此类型”。您无需修改​​其值。这只是静态类型转换。

Typescript在运行时中不存在。因此,当您在Typescript中进行编码时,必须始终牢记“此代码在运行时中正在做什么?” < / p>