首页 > 解决方案 > Typescript 不会为名为“name”的未初始化对象属性触发错误

问题描述

我在我正在编写的 Typescript 代码中发现了一些奇怪的行为。

打字稿游乐场链接

如果该属性名称为,Typescript 不会以某种方式触发未初始化属性的错误name

在此处输入图像描述

这是什么?这是一个错误还是什么?

这是value属性的错误:

速记属性“值”的范围内不存在任何值。要么声明一个,要么提供一个初始化器。(18004)

在此处输入图像描述

interface INTERFACE_A {
    name: string,               // ALSO TRIED WITH OTHER TYPES. SAME RESULT
}

function fooA(x: INTERFACE_A): INTERFACE_A { return x; }

fooA({
    name                        // THIS SHOULD BE AN ERROR (BUT IT'S NOT)
});

const objA: INTERFACE_A = {
    name                        // THIS SHOULD BE AN ERROR (BUT IT'S NOT)
}

interface INTERFACE_B {
    value: string
}

function fooB(x: INTERFACE_B): INTERFACE_B { return x; }

fooB({
    value                       // THIS IS AN ERROR (OK)
});

const objB: INTERFACE_B = {
    value                       // THIS IS AN ERROR (OK)
}

这似乎与 Typescript Playground 无关,因为它也发生在我的 VSCode 开发环境中:

在此处输入图像描述

在此处输入图像描述

更新:

这可能与window.name类型为 的属性有关string。但它的行为仍然不同于window.innerWidth,例如:

innerWidth如果我使用as a会看到 TS 抱怨,但是当我尝试使用as astring时它不会抱怨:window.namenumber

打字稿游乐场链接

在此处输入图像描述

在此处输入图像描述

标签: javascripttypescriptobjectcompiler-errorstypescript-typings

解决方案


{ name }是 的简写{ name: name }window.name是内置属性,而 的属性window在浏览器中是全局的,所以name一个全局属性也等同于window.name.

实际上,您的代码正在执行此操作:

fooA({
  name: window.name
})

这是完全有效的(尽管可能不是你想要的)。


推荐阅读