Как объявить ссылку на существующее пространство имен, которое доступно из комплекта javacript во время выполнения - PullRequest
1 голос
/ 07 октября 2019

Я пишу плагин для существующего приложения Javascript - Forge Autodesk.Viewing

После версии 6 они включили THREE.js в свой комплект приложений.

Прямо сейчас я могу использовать его с моим плагином так:

declare var THREE:any; 

Но я потерял все типы.

Итак, я установил three.js

npm install --save three

Я могу использовать ТРИ и импортировать их. Но мне не нужно импортировать его, так как он уже есть в моем основном приложении. Что мне нужно сделать, это ссылаться на типы.

Итак, я попытался сделать что-то вроде этого:

    declare var THREE:THREE;
//Cannot use namespace 'THREE' as a type.

Затем я попытался:

/// <reference types='three' />, который работает нормально, но:

        const planes:THREE.Plane[] = []; //this line is okey

        planes.push(new THREE.Plane()); //but this says

        //'THREE' refers to a UMD global, 
        // but the current file is a module. 
        // Consider adding an import instead.

Tsc настаивают на том, чтобы мы импортировали его:

import * as THREE from 'three'; 

Он компилируется без проблем, но когда я запускаю приложение, оно вылетает, потому что оно пытается получить еще один экземпляр THREE.js, который яне указывать причину, по которой он у меня внутри основного приложения.

Итак, подведем итог - как объявить правильную ссылку и сохранить типы в пространстве имен, которое доступно в основном приложении javascript?

Ответы [ 3 ]

0 голосов
/ 07 октября 2019

Существует файл определения TypeScript (.d.ts) для Forge Viewer, который вы можете использовать вместе с файлом определения THREE.js: https://forge.autodesk.com/blog/typescript-definitions-forge-viewer-and-nodejs-client-sdk-now-available.

0 голосов
/ 16 октября 2019

Если у вас есть проблема, такая как:

'THREE' refers to a UMD global, but the current file is a module. Consider adding an import instead.

(о UMD)

Вы можете попробовать использовать опцию в tsconfig.json :

"compilerOptions": {
    "allowUmdGlobalAccess": true,

(о параметрах конфигурации)

Это даст компилятору доступ к UMD global, поэтому вам не нужно импортировать или ссылаться на такие модули в этомкейс.

Точно так же и в случае с Three.js. Они уже добавляют ТРИ пространства имен в качестве модуля в глобальную область видимости UMD. Так что если вам нужно включить этот модуль, вы должны импортировать. Если вы хотите только ссылку, вы можете использовать эту опцию. Если машинопись не распознает эту опцию в конфигурации, просто обновите свою машинопись.

npm install typescript

Спасибо, дорогой СалиентБрейн, и дорогой Петр Броз за внимание и помощь.

0 голосов
/ 07 октября 2019

Ypu нужно импортировать ТРИ модуля: Как это:

import * as THREE from 'three'; // or import THREE from 'three';

или

var THREE = require('Three').

и использовать веб-пакет или другой загрузчик модулей (!)

Если выхотите вручную включить дистрибутивный файл THREEJS и использовать привязки TS (определения типов) без модулей (не рекомендуется) - вы можете включить файл Three.d.ts в свой проект (с другими файлами THREEJS d.ts) ииспользовать его с тремя слешами исх. Например:

/// <reference path="..\..\node_modules\@types\three\index.d.ts" />

Примечание: не импортируйте ТРИ пространства имен с «import» или «require» в этом случае.

...