Typescript 打字脚本错误,还是没有?声明仅在以特定格式编写时有效

Typescript 打字脚本错误,还是没有?声明仅在以特定格式编写时有效,typescript,type-declaration,Typescript,Type Declaration,在.d.ts声明文件中,我尝试用四种不同的方式做相同的事情,但只有两种方式有效: // Doesn't work. declare global { const THREE: typeof import('three') } // Doesn't work. import * as _THREE from 'three' declare const THREE: typeof _THREE // Works. import * as _THREE from 'three' decla

.d.ts
声明文件中,我尝试用四种不同的方式做相同的事情,但只有两种方式有效:

// Doesn't work.
declare global {
    const THREE: typeof import('three')
}

// Doesn't work.
import * as _THREE from 'three'
declare const THREE: typeof _THREE

// Works.
import * as _THREE from 'three'
declare global {
    const THREE: typeof _THREE
}

// Works.
declare const THREE: typeof import('three')
'three'
模块包含
导出命名空间three

在前两种情况下,其他使用
THREE
作为全局的
.ts
文件将出现错误
“THREE”表示UMD全局,但当前文件是一个模块。请考虑添加一个导入。< /代码> 

在这两种情况下,其他使用
THREE
global的
.ts
文件没有这样的错误,它们使用了我对
THREE
的定义

f、 例如,如果我在
.d.ts
文件中使用第二个非工作选项:

// globals.d.ts
import * as _THREE from 'three'
declare const THREE: typeof _THREE
// other-file.ts
console.log(THREE) // ERROR: 'THREE' refers to a UMD global, but the current file is a module. Consider adding an import instead.
然后在另一个
.ts
文件中:

// globals.d.ts
import * as _THREE from 'three'
declare const THREE: typeof _THREE
// other-file.ts
console.log(THREE) // ERROR: 'THREE' refers to a UMD global, but the current file is a module. Consider adding an import instead.
但如果我使用第四个(最后一个)选项

那么在另一个文件中就没有问题了:

// other-file.ts
console.log(THREE) // no problem.

为什么前两个选项不起作用,而后两个却起作用?

首先,我要说的是,鉴于这个错误:
'THREE'指的是一个UMD全局文件,但当前文件是一个模块。考虑添加一个导入代替.<代码>,您可能对新的编译器选项<代码> > AuthUnGualAccess < /代码>感兴趣(3.5)(虽然我看到您评论了相关的,确保您没有错过修复)。
关于错误,这只是全局增强如何工作以及什么是模块和什么不是模块的交叉点:

  • global
    只能在模块中使用,脚本文件中不需要使用
    global
  • 如果文件包含
    导入
    导出
    语句,则该文件是一个模块,否则将其视为脚本文件
  • 给定这2条二进制规则,我们得到了您描述的4种可能性

    1。不是模块,带有
    全局
    =>错误。

    declare global {
        const THREE: typeof import('three')
    }
    
    由于该文件不是一个模块,而是一个简单的脚本文件,因此使用
    global
    是一个错误,因为该文件中声明的任何内容都将位于全局命名空间中,那么为什么要添加
    global

    2。模块,不带
    全局
    =>未使用的模块常数

        import * as _THREE from 'three'
        declare const THREE: typeof _THREE
    
    由于该文件包含一个
    import
    ,它是一个模块,因此声明的常量不在全局范围内,因此它只是一个未使用的模块局部变量。在其他文件中得到的错误来自
    three
    模块本身(它声明了一个UMD全局名称空间)

    3。模块,带全局

    import * as _THREE from 'three'
    declare global {
        const THREE: typeof _THREE
    }
    
    declare const THREE: typeof import('three')
    
    在这种情况下,文件是一个模块,但定义是在一个
    全局
    扩充中。这意味着
    THREE
    的定义将放在全局名称空间中,并在其他文件中可用

    4。不是模块,没有全局

    import * as _THREE from 'three'
    declare global {
        const THREE: typeof _THREE
    }
    
    declare const THREE: typeof import('three')
    

    在最后一种情况下,不管导入类型如何,文件都不是模块。只有import语句才能使文件成为模块,而导入类型不能。由于此文件不是模块,因此声明的
    THREE
    常量位于全局名称空间中,在其他文件中也同样可用。

    我也有此类问题

    使用tsconfig.json可以使用:

    "compilerOptions": {
        "allowUmdGlobalAccess": true,
    
    它允许编译器访问UMD全局变量,列出了三种类型。因此,您不需要在之后导入或引用它。与JQuery或$一样。

    我没有收到任何“错误”,它们只是默默地失败了。这是预期的吗?