Объявите Javascript объект глобального пространства имен в VSCode - PullRequest
1 голос
/ 25 февраля 2020

У меня есть новая среда Javascript вместо Node.js или Browser, и у нее есть новый глобальный объект GameGlobal, действующий как global в Node.js или window в браузере. Поэтому, если я присваиваю свойство GameGlobal (например, GameGlobal.THREE = 3), свойство (по THREE, а не GameGlobal.THREE) можно использовать в любом модуле. К сожалению, VSCode не может его распознать.

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

//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_an_entire_modules_contents
//import * as THREE from './js/three.module' //export {...}; cannot be recognized by the WeXin Developer Tool
//import * as THREE from 'three.min'

//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_a_module_for_its_side_effects_only
//if ('object' == typeof GameGlobal) GameGlobal.initAndStart = initAndStart;
//if ('object' == typeof module) {
//module.exports = initAndStart; //<=> export default function initAndStart() {}
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting
GameGlobal.THREE = require('three'); // <=> import * as THREE from 'three'
//import './SubdivisionModifier.js'
/** @type {typeof import('./TransformControls.js').TransformControls} */
GameGlobal.TransformControls = require('TransformControls').TransformControls; // <=> import { TransformControls } from './TransformControls.js'
//}


/// <reference path="../../node_modules/minigame-api-typings/index.d.ts" />
//https://github.com/wechat-miniprogram/minigame-api-typings
//install type definitions (DefinitelyTyped): npm install minigame-api-typings

//https://vscode-docs1.readthedocs.io/en/stable/languages/javascript/#defining-global-variables-outside-dts
/* global GameGlobal */

GameGlobal.mexport = function () { }
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_a_module_for_its_side_effects_only
//import './js/sdk.js': Import an entire module for side effects only, without importing anything.
//This runs the module's global code, but doesn't actually import any values.

//import THREE from "three"


/** @param {THREE.Intersection} intersection*/
function onclick(intersection) {
    intersection.object;
}

В приведенном выше примере, даже если GameGlobal.THREE = require('three'), но всплывающая подсказка на THREE и Intersection в @param {THREE.Intersection} показала мне «любой».

Также, Я ссылался на Определение глобальных переменных за пределами .d.ts , но оно не работало.

Поддержка IntelliSense

VS Code предоставляет IntelliSense для встроенных символов браузеров Node.js и практически всех других сред благодаря использованию файлов определения типов .d.ts. DefinitiveTyped - хранилище файлов наборов для всех основных библиотек и сред JavaScript. С наборами легко управлять, используя TSD , менеджер определения TypeScript. IntelliSense автоматически предоставляется для общих JS и модулей AMD внутри папок вашего проекта.

Итак, есть ли способ, которым я могу настроить и добавить такой глобальный объект пространства имен GameGlobal для VS Код IntelliSense ? Я полагаю, что ключ, вероятно, заключается в предоставлении файла .d.ts.

Я создал и открыл один файл js в VSCode, а затем использовал приведенный ниже код. Он дал мне всплывающие подсказки в виде следующих комментариев:

if ('object' == typeof global) {
    //in Nodejs environment
    //The tooltip shows "any" and then 'module global'.  think it's valid in node.js. 
} else if ('object' == typeof window) {
    //in a browser environment
    //The tooltip shows "var window: Window & typeof globalThis". I think it's valid in browsers. 
}
if ('object' == typeof globalThis) {
    //The tooltip on `globalThis` shows "module globalThis"
}

global.GameGlobal = global;
//window.GameGlobal = window;
GameGlobal.THREE = {
    Vector2: { x: 0, y: 0 }
};
THREE //the tooltip shows "any"
console.log('THREE:', THREE.Vector2.x); //THREE: 0

Прочитав Используя globalThis в Typescript , я написал global.d.ts.

Я обнаружил, что только когда я использовал import THREE from 'three', VSCode мог показывать правильные всплывающие подсказки как для кода THREE.Vector2, так и для комментария @param {THREE.Vector2}, но это было не то, что я ожидал.

Предоставить глобальные объявления для window

Root тип области действия

Node.js v13.9.0 Документация: глобальные объекты

Эти объекты доступны во всех модулях.

Перечисленные здесь объекты указываются c до Node.js. Есть встроенных объектов , которые являются частью самого языка JavaScript, которые также доступны по всему миру.

global

Добавлено: v0.1.27

  • Объект глобального пространства имен.

    В браузерах область верхнего уровня - это глобальная область. Это означает, что в браузере var something определит новую глобальную переменную. В Node.js это отличается. Область верхнего уровня> не является глобальной областью; var something внутри модуля Node.js будет локальным для этого модуля.

MDN: стандартные встроенные объекты

Термин «глобальные объекты» (или стандартные встроенные объекты) здесь не следует путать с глобальным объектом . Здесь «глобальные объекты» относятся к объектам в глобальной области действия .

Доступ к самому глобальному объекту можно получить с помощью оператора this в глобальный охват. Фактически, глобальная область действия состоит из свойств глобального объекта, включая унаследованные свойства, если таковые имеются.

minigame-api-typings
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...