Я хочу расширить определения типов, импортированные в проект ng6 с использованием Three.js (@types/three/index
), с набором функций, которые будут напрямую присоединены к тому же «пространству имен». Что-то вроде: THREE.myFunction()
. Я не хочу объявлять THREE как any
, чтобы подавить проверку типов и линтер, и я предполагаю, что можно было бы обернуть ванильную функцию JS, которая расширяет THREE, используя класс / функцию TS и затем воспользовавшись typings.d.ts
.
Импорт загрузчика
Прежде всего, я хотел бы импортировать в свой проект загрузчик THREE.js, который обычно определяет ванильную функцию, расширяющую THREE
.
Я пытаюсь импортировать _6 _ в службу ng, и я не уверен, как это сделать правильно.
Что я сделал до сих пор:
npm install three --save
npm install @types/three --save-dev
import * as THREE from 'three';
- добавить BinaryLoader в новый массив angular.json
scripts
angular.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' (импортированный как 'THREE') не был найден в 'three'
Предупреждения типа Silencing Type и транспилятор 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