Объявите интерфейсы в файле для JavaScript - PullRequest
0 голосов
/ 27 июня 2018

Информация о проекте

Я работаю над проектом JavaScript, который использует .d.ts файлы. Это следующий вопрос к ранее заданному вопросу, поэтому вы можете просмотреть дополнительную информацию о проекте здесь .

Проблема

Хотя я обычно могу извлечь функции из файлов набора, я не могу извлечь интерфейсы или пространства имен, которые либо пусты, либо состоят исключительно из интерфейсов. Я временно исправил эту проблему, создав const реализацию для каждого интерфейса и используя @typeof ConstantImplementation в комментариях. См. Пример ниже:

// Typings File
export namespace test {
    export interface ITest {
        foo: string;
        bar: number;
    }
    export const Test: ITest;
}

// JS File
if (undefined) var {Test: ITest} = require("globals.d.ts").test; 
// Above line shows `unused var error`

/* @type {typeof ITest} */
var x = {};
x.foo = "hello";
x.bar = 3;
// if I do `x.` intellisense should suggest `foo` and `bar` 

Мне было интересно, есть ли лучший способ обойти проблему, желательно тот, который не выдает ошибку (использование eslint ignore line не является исправлением).

Разъяснение

Этот вопрос не касается получения функциональности из файла наборов. Речь идет исключительно о том, чтобы заставить VSCode intellisense работать с типизацией интерфейсов. Вот изображение, объясняющее, чего я хочу (две линии внутри круга):

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 августа 2019

Так что мне удалось решить проблему с помощью JSDoc

test.d.ts

export namespace test {
    export interface ITest {
        foo: string;
        bar: number;
    }
}

test.js

/**
 * @type {import("./test").test.ITest}
 */

let x;

x.

И intellisense работает сейчас

Working intellisense

Также я обнаружил, что если вы добавите jsconfig.json с

jsconfig.json

{
    "compilerOptions": {
        "checkJs": true
    }
}

Ваш интеллект улучшится

Better intellisense

Update-1

Как указал @nickzoum, если вы определите test.d.ts, как показано ниже

export interface ITest {
    foo: string;
    bar: number;
}

export as namespace test;

Тогда вы также можете использовать форму ниже в JS для intellisense

/** @typedef {import("./test").ITest} ITest */

/** @type {ITest} */
var x = {};
x.
0 голосов
/ 02 февраля 2019

Я думаю, что здесь может быть концептуальное недоразумение, которое лежит в основе вашей проблемы. Похоже, вы хотите, чтобы интерфейсы были доступны во время выполнения . Интерфейсы Typescript - это просто концепция времени компиляции Они ничего не компилируют. Они не существуют во время выполнения.

Я взял эту часть вашего кода и поместил в файл с именем interf.d.ts:

export namespace Interfaces {
    export interface Interface {
        property: string;
    }
}

Затем я создал файл test.ts:

import { Interfaces } from "./interf";

const x: Interfaces.Interface = {
    property: "abc",
};

console.log(x);

Я не получаю сообщение об ошибке компиляции, и оно просто отлично работает. Как и ожидалось, интерфейс экспортирован . const, который вы экспортируете позже, не нужен для экспорта интерфейса (и в любом случае он не экспортирует интерфейс, он экспортирует const, который объявлен для соответствия интерфейсу , но const - это не интерфейс).

Однако, если вы пытаетесь найти в скомпилированном JavaScript что-то, что соответствует вашему интерфейсу, вы не найдете его по той причине, которую я привел выше: это конструкция времени компиляции.

...