在JavaScript的类型文件中声明接口

nic*_*oum 8 javascript intellisense interface visual-studio-code .d.ts

项目信息

我正在开发一个利用.d.ts文件的JavaScript项目。这是我先前提出的问题的后续问题,因此您可以在此处查看有关该项目的更多信息。

问题

尽管我通常可以从类型文件中提取函数,但是我不能提取为空或仅由接口组成的接口或名称空间。我已经通过const为每个接口创建一个实现并@typeof ConstantImplementation在注释中使用来临时解决了此问题。请参见下面的示例:

// Typings File
export namespace test {
    export interface ITest {
        foo: string;
        bar: number;
    }
    export const Test: ITest;
}
Run Code Online (Sandbox Code Playgroud)
// 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` 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来解决该问题,最好是一种不会抛出错误(使用eslint ignore line不是解决方法)的方法。

澄清度

这个问题与从打字文件获取功能无关。纯粹是要使VSCode智能感知与类型接口一起使用。这是一张图片,解释我想要什么(圆圈内的两行):

在此处输入图片说明

Lou*_*uis 5

我认为可能存在概念上的误解,这是您在此处遇到的问题的基础。听起来您希望这些接口在运行时可用。Typescript接口纯粹是一个编译时概念。他们不编译任何东西。它们在运行时不存在。

我将这部分代码放入了一个名为的文件中interf.d.ts

export namespace Interfaces {
    export interface Interface {
        property: string;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了文件test.ts

import { Interfaces } from "./interf";

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

console.log(x);
Run Code Online (Sandbox Code Playgroud)

我没有编译错误,并且执行得很好。如预期的那样,接口导出。在const你以后出口不需要导出接口(反正它并不能导出接口,它导出一个const声明符合的接口,但是const不是接口)。

但是,如果您试图在已编译的JavaScript中找到与您的接口相对应的内容,则由于我上面给出的原因,您将找不到它:它是一个编译时构造。


Tar*_*ani 5

所以我能够使用JSDoc解决问题

测试文件

export namespace test {
    export interface ITest {
        foo: string;
        bar: number;
    }
}
Run Code Online (Sandbox Code Playgroud)

test.js

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

let x;

x.
Run Code Online (Sandbox Code Playgroud)

而智能感知现在

工作智能

另外一两件事,我发现的是,如果添加jsconfig.json

jsconfig.json

{
    "compilerOptions": {
        "checkJs": true
    }
}
Run Code Online (Sandbox Code Playgroud)

您的智商进一步提高

更好的智能感知

更新1

正如@nickzoum所指出的,如果您定义test.d.ts以下内容

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

let x;

x.
Run Code Online (Sandbox Code Playgroud)

然后您也可以在JS中使用以下形式进行智能感知

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

/** @type {ITest} */
var x = {};
x.
Run Code Online (Sandbox Code Playgroud)