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或$一样。我没有收到任何“错误”,它们只是默默地失败了。这是预期的吗?