Javascript Typescript未触发名为“0”的未初始化对象属性的错误;名称“;
我在我正在写的打字脚本代码中发现了一些奇怪的行为 如果未初始化的属性名为Javascript Typescript未触发名为“0”的未初始化对象属性的错误;名称“;,javascript,typescript,object,compiler-errors,typescript-typings,Javascript,Typescript,Object,Compiler Errors,Typescript Typings,我在我正在写的打字脚本代码中发现了一些奇怪的行为 如果未初始化的属性名为name,则Typescript不会触发该属性的错误: 这是什么?这是虫子还是什么 这是值属性的错误: 速记属性“value”的作用域中不存在值。要么声明一个,要么提供一个初始值设定项。(18004) 这似乎与Typescript游戏场无关,因为它也发生在我的VSCode开发环境中: 更新: 这可能与window.name属性有关,该属性的类型为string。但是它的行为仍然不同于窗口。innerWidth,例如:
name
,则Typescript不会触发该属性的错误:
这是什么?这是虫子还是什么
这是值
属性的错误:
速记属性“value”的作用域中不存在值。要么声明一个,要么提供一个初始值设定项。(18004)
这似乎与Typescript游戏场无关,因为它也发生在我的VSCode开发环境中:
更新:
这可能与window.name
属性有关,该属性的类型为string
。但是它的行为仍然不同于窗口。innerWidth
,例如:
如果我使用innerWidth
作为字符串,TS会抱怨,但当我尝试使用窗口时,TS不会抱怨。name
作为编号
:
{name}
是{name:name}
的缩写,window.name
是内置属性,而window
的属性在浏览器中是全局属性,因此name
是一个全局属性,相当于window.name
实际上,您的代码正在执行以下操作:
fooA({
名称:window.name
})
这是完全有效的(虽然可能不是你想要的)。{name}
是{name:name}
的缩写,窗口。name
是内置属性,窗口的属性在浏览器中是全局的,因此name
是一个全局属性,相当于window.name
实际上,您的代码正在执行以下操作:
fooA({
名称:window.name
})
这是完全有效的(尽管可能不是您想要的)。对于此类错误的解决方案,可以将ESLint配置为在使用浏览器全局变量(如name
)时出错,而不显式引用窗口对象(window.name
)
安装ESLint
为typescript代码()安装ESLint和它
安装no restricted globals
软件包
将此添加到.eslintrc.js
中的规则中:
module.exports={
//…省略了其他字段
规则:{
//……省略了其他规则
“无限制全局变量”:[“错误”]。concat(
要求(“混淆浏览器全局”)
),
},
}
要解决此类错误,可以将ESLint配置为在使用浏览器全局变量(如name
)时出错,而不显式引用窗口对象(window.name
)
安装ESLint
为typescript代码()安装ESLint和它
安装no restricted globals
软件包
将此添加到.eslintrc.js
中的规则中:
module.exports={
//…省略了其他字段
规则:{
//……省略了其他规则
“无限制全局变量”:[“错误”]。concat(
要求(“混淆浏览器全局”)
),
},
}
@arslan2012我添加了游乐场作为示例。但这也发生在我的本地开发环境VSCode上。我认为它与操场无关。@arslan2012我添加了操场作为示例。但这也发生在我的本地开发环境VSCode上。我认为这与操场无关。我认为你部分正确。因为如果我将name:string
更改为innerWidth:string
,我会收到一个错误,说明string不能分配给number
,因为window.innerWidth
是一个数字。但是如果我改为name:number
,TS仍然保持沉默,并且不会抱怨window.name
应该是string
。我的意思是,这里有一些更奇怪的东西,我想。看看我添加到问题中的新屏幕。奇怪的是,TypeScript似乎将名称
键入从不
,也就是说,它似乎不同于窗口.名称
(即字符串
)。这就解释了没有错误的原因,因为从不
可分配给任何东西。@Cerberus谢谢。那可能就是这样了。但是当我执行const name=window.string
时。那个name
变量的计算结果是string
。是的,这也是我说的:窗口。name
是string
,但简单地说name
(显然,如果它不是由您的代码定义的话)是从不。我认为您部分正确。因为如果我将name:string
更改为innerWidth:string
,我会收到一个错误,说明string不能分配给number
,因为window.innerWidth
是一个数字。但是如果我改为name:number
,TS仍然保持沉默,并且不会抱怨window.name
应该是string
。我的意思是,这里有一些更奇怪的东西,我想。看看我添加到问题中的新屏幕。奇怪的是,TypeScript似乎将名称
键入从不
,也就是说,它似乎不同于窗口.名称
(即字符串
)。这就解释了没有错误的原因,因为从不
可分配给任何东西。@Cerberus谢谢。那可能就是这样了。但是当我执行const name=window.string
时。那个name
变量被计算为string
。是的,我也这么说:窗口。name
是string
,但简单地说name
(如果它不是由您的代码定义的话)是从不
。
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)
}