Определение доступа TypeScript без импорта файла - PullRequest
0 голосов
/ 13 апреля 2020

В моем приложении Angular я могу получить доступ к типам Angular, установив пакет @ types / angular. Затем в моих файлах TS я могу делать такие вещи, как timeout: ng.ITimeoutService без необходимости импортировать что-либо в мой файл. Затем я могу запустить tsc, и все прекрасно скомпилируется. VSCode также не жалуется, что не может найти ng.ITimeoutService.

Однако, когда я пытаюсь эмулировать это поведение с моими собственными пользовательскими типами, это не работает без необходимости явного импорта модуля в мой файл. Вот что я делаю:

  1. Создать файл vendor/@types/custom/index.d.ts с содержанием:

    export declare class MyClass {...}

  2. В моем tsconfig. json, я добавляю этот путь к typeRoots :

    "typeRoots": ["./vendor/@types/custom"]

Теперь в моем приложении файл . / app / view.ts , я пытаюсь сделать это:

public myObject: MyClass

Однако VSCode, как и TS c, жалуются:

Не удается найти имя 'MyClass'

Я даже пытался использовать ссылки:

/// <reference path="../vendor/@types/custom/index.d.ts" />

Но это дает тот же результат.

Как получить доступ к типу без импорта его файла, аналогично тому, как я могу получить доступ к типам в node_modules / @ types без необходимости их импорта?

1 Ответ

0 голосов
/ 13 апреля 2020

Возможно, вы захотите взглянуть на глобальные определения . Я почти уверен, что именно так библиотеки типа angular делают ng.ITimeoutService. Однако вам может понадобиться ваше собственное пространство имен, как показано ниже.

/*~ If your library has properties exposed on a global variable,
 *~ place them here.
 *~ You should also place types (interfaces and type alias) here.
 */
declare namespace myLib {
  //~ We can write 'myLib.timeout = 50;'
  let timeout: number;
}

Редактировать

Похоже, вы можете добавить класс global в файл types.d.ts. Я использую typescript 3.8.3 в VSCode.

Вот мой types.d.ts

// This is accesible anywhere now
declare class Aaaaa {
  myFunction();
}

Вот мой tsconfig.json

{
  "compilerOptions": {
    "outDir": "dist",
    "module": "es2015",
    "moduleResolution": "node",
    "target": "es5",
    "lib": ["es6", "es2016", "dom"],
    "baseUrl": "src",
    "preserveConstEnums": true,
    "sourceMap": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "typeRoots": ["node_modules/@types", "src/types.d.ts"]
  },
  "include": ["src"],
  "exclude": ["node_modules", "dist"]
}

Предупреждение: глобальные типы не являются хорошая идея (должен быть последним вариантом). Кроме того, в глобальном классе не может быть инициализаторов, поэтому реализация должна загружаться глобально где-то еще (обычно с помощью тегов скрипта в браузере).

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