为什么仅通过将对对象的引用传递给函数而不是将对象传递为文字形式,就可以避免打字稿中过多的属性检查?

Muh*_*qib 0 typescript

看看这个示例打字稿代码

function printLabel(labelledObj: { label: string }) {
    console.log(labelledObj.label);
}

printLabel({ size: 10, label: 'hello' });
Run Code Online (Sandbox Code Playgroud)

上面的代码无法编译,并出现以下错误:

1.ts:6:14-错误TS2345:参数'{size:number; 标签:字符串;}'不可分配给类型'{label:string; }'。对象文字只能指定已知的属性,并且'size'在类型'{label:string; }'。

简而言之,size是一个多余的属性,不符合{ label: string }导致编译器大喊大叫的类型。让我们稍微修改一下上面的代码片段:

function printLabel(labelledObj: { label: string }) {
    console.log(labelledObj.label);
}
const obj = { size: 10, label: 'hello' }
printLabel(obj);
Run Code Online (Sandbox Code Playgroud)

现在我们将对象字面量提取出来,该字面量已printLabel在较早的示例中传递到名为的中间引用中obj,最奇怪的部分是它现在不会抱怨并且可以正常工作。为什么打字稿表现得如此?

Nur*_*yev 6

这是设计使然。简而言之,Typescript的创建者采用这种方式是因为他们知道Javascript是一种非常动态的语言,具有许多这样的用例。

您应该仔细阅读以下内容:https : //www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks (不过我敢打赌,阅读该问题会引起问题)。

对象文字得到特殊处理

他们的逻辑可能是这样的:如果您有一个变量,那么它可能来自某个第三方,那么您将无能为力。另一方面,如果传递对象文字,则应对其正确的类型负责。