我想使用 Three.js ( @types/three/index
) 扩展导入到 ng6 项目中的类型定义,其中包含一组将直接附加到相同“命名空间”的函数。类似的东西:THREE.myFunction()
。我不想声明 THREEany
来抑制类型检查和 linter,我想可以包装一个使用 TS 类/函数扩展 THREE 的 vanilla JS 函数,然后利用typings.d.ts
.
导入加载器
首先,我想在我的项目中导入一个 THREE.js 加载器,这通常定义了一个扩展的 vanilla 函数THREE
。
我正在尝试将其导入BinaryLoader
ng 服务,但我不确定如何以正确的方式进行操作。
到目前为止我做了什么:
npm install three --save
npm install @types/three --save-dev
import * as THREE from 'three';
- 将 BinaryLoader 添加到新的angular.json
scripts
数组
角.json
"scripts": [
"./node_modules/three/examples/js/loaders/BinaryLoader.js"
]
到目前为止一切顺利,但现在我需要创建一个二进制加载器:
import * as THREE from 'three';
// import { BinaryLoader } from 'three';
// import 'three/examples/js/loaders/BinaryLoader';
export class ThreeManagerService {
const loader = new THREE.BinaryLoader();
...
我必须找到BinaryLoader
以@types/three/index
某种方式添加的方法。这样,我应该能够扩展类型定义以便能够创建新类型THREE.BinaryLoader
。有可能做这样的事情吗?
我得到的警告是:
./src/app/shared/three-manager.service.ts 24:25-43 中的警告“在‘三’中找不到导出‘BinaryLoader’(导入为‘三’)
静音类型警告和 TS 转译器
摆脱警告和错误的解决方法可能是这样的:
import * as THREEJS from 'three';
declare const THREE: any;
export class ThreeManagerService {
const loader = new THREE.BinaryLoader();
事实上,我认为这种解决方法是一个非常丑陋的“修复”。我想尽可能地使用类型系统。
编辑:获取示例以与 Intellisense 和 Typescript 配合使用
在等待完全重写示例以与 ES6 模块和命名空间兼容时,可以定义一个本地模块来公开和增强全局,在/src/node_modules/three-extras/index.ts
:
import * as THREE from 'three';
declare global {
interface Window {
THREE: typeof THREE;
}
}
window.THREE = THREE;
require('three/examples/js/controls/OrbitControls');
require('three/examples/js/loaders/GLTFLoader');
通过:https ://github.com/mrdoob/three.js/issues/9562#issuecomment-386522819