Ссылка на файл определения TypeScript из HTML `<script>` с VS Code

Sep 19 2020

Я могу использовать JSDocв scriptтеге в HTML , но я не в состоянии сделать ссылку на файл определения типа ( .d.ts). Я использую VS Code. Возможно ли это, и если да, то как мне это сделать? Вот пример кода ниже:

tsconfig.jsonФайл (я не знаю , как использовать это вполне в моих тестах, это , кажется, не потребуется.):

{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "myLib": ["types/MyLib/index.d.ts"],
            "myLib2": ["types/MyLib/index2.d.ts"]
        }
    }
}

Попытка 1:

В types/MyLib/index.d.ts:

declare namespace myLib {
  function makeGreeting(s: string): string
  let numberOfGreetings: number
}

В файле JS index.jsи работает нормально:

/// <reference path="./types/MyLib/index.d.ts" />
// @ts-check

var result = myLib.makeGreeting("Cheese")
console.log(result)

В файле HTML (ничего из этого не работает) index.html:

<script>
    /// <reference path="./types/MyLib/index.d.ts" />
    // @ts-check
    var result = myLib.makeGreeting("Cheese")
</script>

<script>
    // @ts-check
    /** @type {import("./types/MyLib/index").myLib} */
    var myLib = Window.myLib
    var result = myLib.makeGreeting("Orange")
</script>

<script>
    // @ts-check
    /** @typedef {import("./types/MyLib/index").myLib} myLib */
    /** @type {myLib} */
    var myLib = Window.myLib
    var result = myLib.makeGreeting("Orange")
</script>

Попытка 2:

В types/MyLib/index2.d.ts:

export declare module myLib {
  export function makeGreeting(s: string): string
}

В файле JS index2.jsи работает нормально:

/// <reference path="./types/MyLib/index2.d.ts" />
// @ts-check

var result = myLib.makeGreeting("Cheese")
console.log(result)

В файле HTML (ничего из этого не работает) index2.html:

<script>
    /// <reference path="./types/MyLib/index2.d.ts" />
    // @ts-check
    var result = myLib.makeGreeting("Cheese")
</script>

<script>
    // @ts-check
    /** @type {import("./types/MyLib/index2").myLib} */
    var myLib = Window.myLib
    var result = myLib.makeGreeting("Orange")
</script>

<script>
    // @ts-check
    /** @typedef {import("./types/MyLib/index2").myLib} myLib */
    /** @type {myLib} */
    var myLib = Window.myLib
    var result = myLib.makeGreeting("Orange")
</script>

Ответы

1 hackape Sep 26 2020 at 18:59

Я провел небольшое исследование, покопался в исходном коде и обнаружил, что языковая служба, используемая для встраивания <script>внутри HTML, полностью отличается от той, которая используется для автономного .js/.tsфайла.

Проверьте ссылку выше, если вам интересно. Как видите, это еще одно встроенное расширение "html-language-features"в отличие от "typescript-language-features". Итак, во-первых, они не могут вести себя одинаково. Во-вторых, используемый экземпляр языковой службы ts намеренно создан с фиксированным и упрощенным ts.compilerOptionsинтерфейсом, при этом пользователю не предоставляется никаких настроек API для его настройки.

Ваш запрос функции на самом деле является давним, см. # 26338 , датируется 2017 годом, но команда vscode, похоже, не хочет отвечать.

Итак, здесь тупик ... Невозможно с официальным расширением.

Возможное решение - разветвить проект html-language-features, чтобы создать индивидуальную сборку, чтобы скрыть в себе нужные вам функции. Вы можете отключить встроенное расширение и заменить его собственной сборкой.

На какой код необходимо изменить, я не эксперт в TS программирования API, но я могу направить вас к этой @shuaihuGao парню патч , найденный в вышеуказанном вопросе GitHub. Патч добавляет параметр настройки html.libDefinitionFilesдля включения списка .d.tsфайлов при проверке встроенного JS-скрипта.

Не совсем то, о чем вы спрашиваете, но тем не менее хороший обходной путь. Возможно, вы захотите попробовать, ссылка для скачивания здесь .