如何覆盖TypeScript UMD全局类型定义?

时间:2019-05-12 22:43:14

标签: javascript typescript three.js type-declaration

我已经安装了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.tssrc里面。

如果我添加

/// <reference path="./global.d.ts" />

src/my-code.js文件(JavaScript)的顶部,然后它起作用了,我可以跳到THREE的定义,这将我带到我的global.d.ts文件。

为什么没有reference评论就无法使用?

3 个答案:

答案 0 :(得分:2)

对于three.js,您可以使用编译器选项将此本地 globals 小鸡跳过为小鸡:

"compilerOptions": {
    "allowUmdGlobalAccess": true,

这将使打字稿可以访问您的项目全局UMD,安装时会列出three.js。然后,您可以像在JQuery中一样在项目中使用它。

如果该选项不可用-更新您的打字稿。

Some details

答案 1 :(得分:1)

以上应该可以。只有一个小陷阱:

两个global文件具有相同的名称! (即global.tsglobal.d.ts

在这种情况下,TypeScript似乎将它们合并在一起(或某种形式),因此似乎将global视为同一模块(如import './global'中的模棱两可)。

因此,通过将一个模块重命名为其他名称,一切都可以正常工作。

例如,将src/global.ts重命名为src/make-global.ts,然后离开src/global.d.ts,它将起作用。

我一直想知道到底发生了什么,直到我重命名了其中一个文件。

答案 2 :(得分:1)

您应该在handbook中检查TypeScript类型解析策略。

在该状态下,.ts个文件优先于.d.ts

(我自己碰到了同样的问题)