如果是文字,Typescript会正确拒绝函数参数中的错误类型,但如果是变量,则不会

时间:2018-11-07 17:01:39

标签: typescript

我偶然发现了以下问题,在我看来,Typescript无法捕获类型错误。

说实话,Typescript可能会遗漏一些奇怪的东西,所以我怀疑是我遗漏了一些东西。如果有人可以帮助我理解我,我将不胜感激。

以下代码无法正确使用tsc v3.1.6编译

type Foo = { bar: string };
function test(x: Foo) { console.log(x); }
test({ bar: 'bar', wrong: 'wrong' });

...出现以下错误:

test.ts:3:20 - error TS2345: Argument of type '{ bar: string; wrong: 
string; }' is not assignable to parameter of type 'Foo'.
  Object literal may only specify known properties, and 'wrong' does 
  not exist in type 'Foo'.

3 test({ bar: 'bar', wrong: 'wrong' });
                     ~~~~~~~~~~~~~~

但是,以下代码以某种方式可以很好地编译(tsc v3.1.6):

type Foo = { bar: string };
function test(x: Foo) { console.log(x); }
const z = { bar: 'bar', wrong: 'wrong' };
test(z);

我希望第二个代码段失败,并出现与第一个相同的错误。


编辑1

因此,我只是再次仔细阅读了错误消息,并且确实说到“对象文字可能……”,这意味着该规则仅适用于文字,不适用于局部变量,从而说明了问题。

但是,我仍然想知道为什么该规则也不适用于变量的原因是什么。


编辑2

阅读评论后,我意识到我的问题与“多余的财产检查”有关。该问题的替代标题可能是:

为什么“多余的属性检查”仅适用于对象文字?

0 个答案:

没有答案