Emit @overload comments on generated overloads in.d.ts (#54846)

This commit is contained in:
Nathan Shively-Sanders
2023-07-06 13:23:06 -07:00
committed by GitHub
parent b1a96a37b5
commit a05699c9b9
8 changed files with 262 additions and 0 deletions
+4
View File
@@ -7440,6 +7440,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
if (typeArguments) {
node.typeArguments = factory.createNodeArray(typeArguments);
}
if (signature.declaration?.kind === SyntaxKind.JSDocSignature && signature.declaration.parent.kind === SyntaxKind.JSDocOverloadTag) {
const comment = getTextOfNode(signature.declaration.parent.parent, /*includeTrivia*/ true).slice(2, -2).split(/\r\n|\n|\r/).map(line => line.replace(/^\s+/, " ")).join("\n");
addSyntheticLeadingComment(node, SyntaxKind.MultiLineCommentTrivia, comment, /*hasTrailingNewLine*/ true);
}
cleanup?.();
return node;
@@ -120,10 +120,39 @@ function flatMap(array, iterable) {
//// [jsFileFunctionOverloads.d.ts]
/**
* @overload
* @param {number} x
* @returns {'number'}
*/
declare function getTypeName(x: number): 'number';
/**
* @overload
* @param {string} x
* @returns {'string'}
*/
declare function getTypeName(x: string): 'string';
/**
* @overload
* @param {boolean} x
* @returns {'boolean'}
*/
declare function getTypeName(x: boolean): 'boolean';
/**
* @template T
* @template U
* @overload
* @param {T[]} array
* @param {(x: T) => U[]} iterable
* @returns {U[]}
*/
declare function flatMap<T, U>(array: T[], iterable: (x: T) => U[]): U[];
/**
* @template T
* @overload
* @param {T[][]} array
* @returns {T[]}
*/
declare function flatMap<T>(array: T[][]): T[];
/**
* @template T
@@ -110,10 +110,90 @@ function flatMap(array, iterable) {
//// [jsFileFunctionOverloads2.d.ts]
/**
* @overload
* @param {number} x
* @returns {'number'}
*
* @overload
* @param {string} x
* @returns {'string'}
*
* @overload
* @param {boolean} x
* @returns {'boolean'}
*
* @param {unknown} x
* @returns {string}
*/
declare function getTypeName(x: number): 'number';
/**
* @overload
* @param {number} x
* @returns {'number'}
*
* @overload
* @param {string} x
* @returns {'string'}
*
* @overload
* @param {boolean} x
* @returns {'boolean'}
*
* @param {unknown} x
* @returns {string}
*/
declare function getTypeName(x: string): 'string';
/**
* @overload
* @param {number} x
* @returns {'number'}
*
* @overload
* @param {string} x
* @returns {'string'}
*
* @overload
* @param {boolean} x
* @returns {'boolean'}
*
* @param {unknown} x
* @returns {string}
*/
declare function getTypeName(x: boolean): 'boolean';
/**
* @template T
* @template U
* @overload
* @param {T[]} array
* @param {(x: T) => U[]} iterable
* @returns {U[]}
*
* @overload
* @param {T[][]} array
* @returns {T[]}
*
* @param {unknown[]} array
* @param {(x: unknown) => unknown} iterable
* @returns {unknown[]}
*/
declare function flatMap<T, U>(array: T[], iterable: (x: T) => U[]): U[];
/**
* @template T
* @template U
* @overload
* @param {T[]} array
* @param {(x: T) => U[]} iterable
* @returns {U[]}
*
* @overload
* @param {T[][]} array
* @returns {T[]}
*
* @param {unknown[]} array
* @param {(x: unknown) => unknown} iterable
* @returns {unknown[]}
*/
declare function flatMap<T, U>(array: T[][]): T[];
/**
* @template T
@@ -107,8 +107,28 @@ declare class Example<T> {
*/
constructor(value: T);
value: T;
/**
* @overload
* @param {Example<number>} this
* @returns {'number'}
*/
getTypeName(this: Example<number>): 'number';
/**
* @overload
* @param {Example<string>} this
* @returns {'string'}
*/
getTypeName(this: Example<string>): 'string';
/**
* @template U
* @overload
* @param {(y: T) => U} fn
* @returns {U}
*/
transform<U>(fn: (y: T) => U): U;
/**
* @overload
* @returns {T}
*/
transform(): T;
}
@@ -101,8 +101,54 @@ declare class Example<T> {
*/
constructor(value: T);
value: T;
/**
* @overload
* @param {Example<number>} this
* @returns {'number'}
*
* @overload
* @param {Example<string>} this
* @returns {'string'}
*
* @returns {string}
*/
getTypeName(this: Example<number>): 'number';
/**
* @overload
* @param {Example<number>} this
* @returns {'number'}
*
* @overload
* @param {Example<string>} this
* @returns {'string'}
*
* @returns {string}
*/
getTypeName(this: Example<string>): 'string';
/**
* @template U
* @overload
* @param {(y: T) => U} fn
* @returns {U}
*
* @overload
* @returns {T}
*
* @param {(y: T) => unknown} [fn]
* @returns {unknown}
*/
transform<U>(fn: (y: T) => U): U;
/**
* @template U
* @overload
* @param {(y: T) => U} fn
* @returns {U}
*
* @overload
* @returns {T}
*
* @param {(y: T) => unknown} [fn]
* @returns {unknown}
*/
transform<U>(): T;
}
+52
View File
@@ -98,7 +98,59 @@ uncheckedInternally("zero", "one");
//// [overloadTag1.d.ts]
/**
* @overload
* @param {number} a
* @param {number} b
* @returns {number}
*
* @overload
* @param {string} a
* @param {boolean} b
* @returns {string}
*
* @param {string | number} a
* @param {string | number} b
* @returns {string | number}
*/
export function overloaded(a: number, b: number): number;
/**
* @overload
* @param {number} a
* @param {number} b
* @returns {number}
*
* @overload
* @param {string} a
* @param {boolean} b
* @returns {string}
*
* @param {string | number} a
* @param {string | number} b
* @returns {string | number}
*/
export function overloaded(a: string, b: boolean): string;
/**
* @overload
* @param {number} a
* @param {number} b
* @returns {number}
*
* @overload
* @param {string} a
* @param {boolean} b
* @returns {string}
*/
export function uncheckedInternally(a: number, b: number): number;
/**
* @overload
* @param {number} a
* @param {number} b
* @returns {number}
*
* @overload
* @param {string} a
* @param {boolean} b
* @returns {string}
*/
export function uncheckedInternally(a: string, b: boolean): string;
+17
View File
@@ -73,8 +73,25 @@ var d = new Foo('str', 2);
//// [overloadTag2.d.ts]
export class Foo {
/**
* Should not have an implicit any error, because constructor's return type is always implicit
* @constructor
* @overload
* @param {string} a
* @param {number} b
*/
constructor(a: string, b: number);
/**
* @constructor
* @overload
* @param {number} a
*/
constructor(a: number);
/**
* @constructor
* @overload
* @param {string} a
*/
constructor(a: string);
#private;
}
@@ -114,7 +114,21 @@ function flatMap(array, iterable) {
//// [templateInsideCallback.d.ts]
/**
* @overload
* @template T
* @template U
* @param {T[]} array
* @param {(x: T) => U[]} iterable
* @returns {U[]}
*/
declare function flatMap<U>(): any;
/**
* @overload
* @template T
* @param {T[][]} array
* @returns {T[]}
*/
declare function flatMap(): any;
/**
* @typedef Oops