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)
    }