在命名空间和类之间切换的括号?

zap*_*apl 6 typescript visual-studio-code

使用旧版 javascript,我大致遇到了以下 js 代码

// module1.js
class Class {
    constructor() { console.log('hello') }
}
const exported = {
    Class: Class,
}
module.exports = exported
Run Code Online (Sandbox Code Playgroud)

在打字稿中是这样使用的

// module2.ts
import Module1 from './module1'

class Subclass extends Module1.Class { // <<
    ...
Run Code Online (Sandbox Code Playgroud)

这里 vscode 显示错误和以下类型提示

(alias) const Module1: {
    Class: typeof Class;
}
import Module1
----------------------------------------
Cannot find namespace 'Module1'. ts(2503)
Run Code Online (Sandbox Code Playgroud)

我很好奇的是,在玩完之后我添加了括号,如下所示

class Subclass extends (Module1).Class {
Run Code Online (Sandbox Code Playgroud)

vscode 不再显示错误。这个错误是什么?那些括号的含义是什么?我找不到有关命名空间、导入别名等的任何内容...

顺便说一下,使用 tsc 编译时没有错误,代码可以以任何方式工作。

tsconfig 的一些相关部分(nodejs、ts 4.8.2)

    "target": "es2019",
    "module": "commonjs",
    "allowJs": true,
    "checkJs": false,
    "esModuleInterop": true,
Run Code Online (Sandbox Code Playgroud)

注意:如果文件是通过导入的,也没有什么区别,import Module1 = require('./module1')所以我猜它与esModuleInterop.

Tib*_*ic4 1

在这种情况下,错误是正确的。Module1 不是命名空间,而是一个值。您不能对值使用点运算符。您可以在命名空间上使用点运算符,但不能在值上使用。

括号是类型断言。它们告诉编译器您知道自己在做什么,并且 Module1 是一个命名空间。然后编译器将允许您在其上使用点运算符。