I'm working on a JavaScript project that utilizes .d.ts
files. This is a subsequent question to a question I previously asked, so you can view more information regarding the project here.
Although I can normally extract functions from the typings files I can't extract interfaces or namespaces that are either empty or consist purely of interfaces. I have temporarily fixed this problem by creating a const
implementation for each interface and using @typeof ConstantImplementation
in the comments. See Example below:
// 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`
I was wondering if there is a better way to go around the problem, preferably one that doesn't throw an error (using eslint ignore line
isn't a fix).
This question is not about getting functionality from typings file. It's purely about making VSCode intellisense working with typings Interfaces. Here is an image to explain what it is that I want (the two lines inside the circle):
Interfaces are not a thing in JavaScript, not really anyway. JavaScript is a dynamic language, one where types are changed so often that the developer may not have even realised, because of this people argue there is no need for an interface to be added to the ECMAScript standard that JavaScript is based on.
Example: Interface and Objectsinterface IPerson { firstName:string, lastName:string, sayHi: ()=>string } var customer:IPerson = { firstName:"Tom", lastName:"Hanks", sayHi: ():string =>{return "Hi there"} } console. log("Customer Object ") console. log(customer. firstName) console.
The interface declaration declares various attributes about the interface, such as its name and whether it extends other interfaces. The interface body contains the constant and the method declarations for that interface. The StockWatcher interface and the structure of an interface definition.
So I was able to solve the issue using JSDoc
test.d.ts
export namespace test {
export interface ITest {
foo: string;
bar: number;
}
}
test.js
/**
* @type {import("./test").test.ITest}
*/
let x;
x.
And the intellisense works nows
Also one thing I found is that if you add jsconfig.json
with
jsconfig.json
{
"compilerOptions": {
"checkJs": true
}
}
Your intellisense improves further
Update-1
As pointed out by @nickzoum, if you define the test.d.ts
like below
export interface ITest {
foo: string;
bar: number;
}
export as namespace test;
Then you can also use below form in JS for intellisense
/** @typedef {import("./test").ITest} ITest */
/** @type {ITest} */
var x = {};
x.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With