javascript - 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.name
number
解决方案
{ name }
是 的简写{ name: name }
,window.name
是内置属性,而 的属性window
在浏览器中是全局的,所以name
一个全局属性也等同于window.name
.
实际上,您的代码正在执行此操作:
fooA({
name: window.name
})
这是完全有效的(尽管可能不是你想要的)。
推荐阅读
- java - java.lang.IllegalArgumentException:没有找到类型返回值的转换器:类 java.util.ArrayList
- java - 从没有window.open的rest api下载文件
- import - 错误:找不到模块“nativescript-zxing”
- webpack - 如何在 Svelte 编译器中使用 Rollup 或 Webpack 预处理组件 CSS 和全局样式?
- swift - Swift - 调度队列和 U/I 串行运行
- java - 如何解决:预期的数组类型,找到 int?在使用数组而不是列表的冒泡排序中
- php - 运行自定义帖子类型的查询时,为什么“>”会在 wordpress 中关闭我的 php 查询?
- excel - 如何根据百分比对学生的排名进行排名
- python - 以编程方式递归查找所有正在使用的函数
- google-colaboratory - 在 Google Colaboratory 机器上打开端口