-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Design Policy] Consider JSDoc feature parity with Typescript #30624
Comments
I've had some luck with
👍 |
Function overloading can be done using: /** @type {((name: string) => Buffer) & ((name: string, encoding: string) => string))} */
const readFile = (name, encoding = null) => { … } I discovered this purely by accident. |
|
|
But they don't work for the current file, only imported ones. |
But they do! // test.d.ts
interface X { a: string }
// test.js
/** @type {X} */
const x = { a: 'one' }; You just have to include the By the way, many of these tricks I also discovered by pure accident; it would be nice if they were properly documented. The page dedicated to this has improved a lot recently, but there's still a lot of things I had to figure out by trial-and-error. |
@steinuil Ok I should be more specific then. Function overloading does not work - at least the last time I checked: // test.d.ts
declare function test(arg1: string, arg2: number, arg3: () => void): void;
declare function test(arg2: number, arg3: () => void): void;
declare function test(arg1: string, arg3: () => void): void;
declare function test(arg3: () => void): void;
// test.js
function test(arg1, arg2, arg3) {
// ... args are `any`
} |
Also |
@AlCalzone function overloads only affect usages of the function, not parameter types within a function - this is true in TS, too. You need to actually annotate parameter types on the implementation (compatible with the overloads) to get checking in the function body. |
@global doesnt seem to work having them in the same file yields he same result { the error is cannot find name 'foo' } |
Would e.g. #28730 fall under this umbrella? I'm trying to use JSDoc to describe existing sources that define getter/setter properties with |
I'm using this hack to get support for the const REGEXP = /@private(?<suffix>[\n\r\s\w]+)\*\/(?<whitespace>[\n\r\s]+)(?<memberName>[\w]+)\b/g;
const source = `
export class Foo {
/** Focuses the element. */
focus(): void;
/**
* @param {string} message
* @return {Error}
* @private
*/
createError(message: string): Error;
}
`
source.replace(REGEXP, (...args) => {
const [{suffix, whitespace, memberName}] = [...args].reverse();
return `@private${suffix}*/${whitespace}private ${memberName}`
}) |
Here's an issue for declaration merging with JSDoc: |
Search Terms
jsdoc parity, jsdoc equivalence, jsdoc
Suggestion
The JSDoc mode of TypeScript is very useful in cases where a build step (esp for node libraries for example) isn't desired or when other constraints prevent not writing in JS. However it can be annoying when trying to implement something that can't be expressed in JSDoc mode due to requiring Typescript syntax.
As such I would like to propose that TypeScript ensures that anything that can be written inside a
.ts
file can be expressed (in at least some way) within a pure javascript + jsdoc file.In order to get an idea of the current scope needed for feature parity this is a list of issues and features that break parity between the two modes (if any are missing just say and I'll add to the list):
[Bug?] No way to express theobject
typeCurrently in JSDocFixed/** @type {object} */
is equivalent to/** @type {any} */
, there doesn't seem to be any way to representconst x: object
purely in JS + JSDoc, this seems like a bug.interface
abstract class
Fixedprotected
/private
membersfunction overloadingv5.0open issuedefaults for genericsopen issuedeclare
syntax in it's various forms and declaration mergingdeclare global { ... }
declare module "moduleName"
declare class Foo
declare interface
declare namespace
namespace
enum
v4.5as const
open issueexpr!
Checklist
My suggestion meets these guidelines:
The text was updated successfully, but these errors were encountered: