我已经安装了three@^0.103.0
,它有自己的类型定义。
在我项目的src/global.d.ts
中,我有
import * as _THREE from 'three'
declare global {
const THREE: typeof _THREE
}
然后在src/global.ts
中拥有
import * as THREE from 'three'
(window as any).THREE = { ...THREE }
然后在src/my-code.js
中,我尝试将THREE
用作全局变量,例如。
console.log(new THREE.Vector3(1,2,3)) // ERROR, 'THREE' refers to a UMD global, but the current file is a module. Consider adding an import instead.
它告诉我'THREE' refers to a UMD global, but the current file is a module. Consider adding an import instead.
。
当我跳到THREE
的定义时,它将带我到node_modules/three/src/Three.d.ts
,而不是我的src/global.d.ts
文件。
那么,看来TypeScript忽略了我的global.d.ts
定义?
我的tsconfig.json
包含
"allowJs" true,
"checkJs" true,
"include": ["src/**/*"]
我有global.d.ts
在src
里面。
如果我添加
/// <reference path="./global.d.ts" />
到src/my-code.js
文件(JavaScript)的顶部,然后它起作用了,我可以跳到THREE
的定义,这将我带到我的global.d.ts
文件。
为什么没有reference
评论就无法使用?
答案 0 :(得分:2)
对于three.js,您可以使用编译器选项将此本地 globals 小鸡跳过为小鸡:
"compilerOptions": {
"allowUmdGlobalAccess": true,
这将使打字稿可以访问您的项目全局UMD,安装时会列出three.js。然后,您可以像在JQuery中一样在项目中使用它。
如果该选项不可用-更新您的打字稿。
答案 1 :(得分:1)
以上应该可以。只有一个小陷阱:
两个global
文件具有相同的名称! (即global.ts
和global.d.ts
)
在这种情况下,TypeScript似乎将它们合并在一起(或某种形式),因此似乎将global
视为同一模块(如import './global'
中的模棱两可)。
因此,通过将一个模块重命名为其他名称,一切都可以正常工作。
例如,将src/global.ts
重命名为src/make-global.ts
,然后离开src/global.d.ts
,它将起作用。
我一直想知道到底发生了什么,直到我重命名了其中一个文件。
答案 2 :(得分:1)