У меня есть новая среда 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