This commit is contained in:
Gabriela Araujo Britto 2024-10-09 13:32:31 -07:00
Родитель 827962fab3
Коммит 4e773730b7
4 изменённых файлов: 49 добавлений и 3 удалений

Просмотреть файл

@ -45777,12 +45777,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
const constraint = getConstraintOfTypeParameter(typeParam);
if (!constraint || !(constraint.flags & TypeFlags.Union)) continue;
if (typeParam.symbol && typeParam.symbol.declarations && typeParam.symbol.declarations.length === 1) {
const container = typeParam.symbol.declarations[0].parent;
const declaration = typeParam.symbol.declarations[0];
const container = isJSDocTemplateTag(declaration.parent) ? getJSDocHost(declaration.parent) : declaration.parent;
if (!isFunctionLike(container)) continue;
let reference: Identifier | undefined;
let hasInvalidReference = false;
for (const paramDecl of container.parameters) {
const typeNode = paramDecl.type;
const typeNode = getEffectiveTypeAnnotationNode(paramDecl);
if (!typeNode) continue;
if (isTypeParameterReferenced(typeParam, typeNode)) {
let candidateReference;
@ -45815,7 +45816,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
// - if the parameter is optional, then `T`'s constraint must allow for undefined
function getValidParameterReference(paramDecl: ParameterDeclaration, constraint: Type): Identifier | undefined {
if (!isIdentifier(paramDecl.name)) return;
if (paramDecl.questionToken && !containsUndefinedType(constraint)) return;
const isOptional = !!paramDecl.questionToken || isJSDocOptionalParameter(paramDecl);
if (isOptional && !containsUndefinedType(constraint)) return;
return paramDecl.name;
}

Просмотреть файл

@ -32,3 +32,16 @@ function source(type = "javascript") {
);
}
/**
* @template {boolean} T
* @param {T} b
* @returns {T extends true ? 1 : T extends false ? 2 : never}
*/
function simple(b) {
>simple : Symbol(simple, Decl(file.js, 13, 1))
>b : Symbol(b, Decl(file.js, 20, 16))
return b ? 1 : 2;
>b : Symbol(b, Decl(file.js, 20, 16))
}

Просмотреть файл

@ -63,3 +63,25 @@ function source(type = "javascript") {
);
}
/**
* @template {boolean} T
* @param {T} b
* @returns {T extends true ? 1 : T extends false ? 2 : never}
*/
function simple(b) {
>simple : <T extends boolean>(b: T) => T extends true ? 1 : T extends false ? 2 : never
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
>b : T
> : ^
return b ? 1 : 2;
>b ? 1 : 2 : 2 | 1
> : ^^^^^
>b : T
> : ^
>1 : 1
> : ^
>2 : 2
> : ^
}

Просмотреть файл

@ -17,4 +17,13 @@ function source(type = "javascript") {
? sources.get(type)
: sources.get("some other thing")
);
}
/**
* @template {boolean} T
* @param {T} b
* @returns {T extends true ? 1 : T extends false ? 2 : never}
*/
function simple(b) {
return b ? 1 : 2;
}