fix(49080): --exactOptionalPropertyTypes seems to be ignored for JSDoc types (#49910)

* fix(49080): handle JSDocPropertyTag as optional prop

* move condition to utility function isOptionalDeclaration

* add additional tests

* update baseline
This commit is contained in:
Oleksandr T
2022-12-13 01:03:49 +02:00
committed by GitHub
parent 355991c806
commit 708a522ddf
11 changed files with 197 additions and 13 deletions

View File

@@ -535,9 +535,11 @@ import {
isJSDocNode,
isJSDocNonNullableType,
isJSDocNullableType,
isJSDocOptionalParameter,
isJSDocOptionalType,
isJSDocParameterTag,
isJSDocPropertyLikeTag,
isJSDocPropertyTag,
isJSDocReturnTag,
isJSDocSignature,
isJSDocTemplateTag,
@@ -599,6 +601,7 @@ import {
isOmittedExpression,
isOptionalChain,
isOptionalChainRoot,
isOptionalDeclaration,
isOptionalJSDocPropertyLikeTag,
isOptionalTypeNode,
isOutermostOptionalChain,
@@ -10164,11 +10167,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
return getTypeForBindingElement(declaration as BindingElement);
}
const isProperty = isPropertyDeclaration(declaration) && !hasAccessorModifier(declaration) || isPropertySignature(declaration);
const isOptional = includeOptionality && (
isProperty && !!declaration.questionToken ||
isParameter(declaration) && (!!declaration.questionToken || isJSDocOptionalParameter(declaration)) ||
isOptionalJSDocPropertyLikeTag(declaration));
const isProperty = (isPropertyDeclaration(declaration) && !hasAccessorModifier(declaration)) || isPropertySignature(declaration) || isJSDocPropertyTag(declaration);
const isOptional = includeOptionality && isOptionalDeclaration(declaration);
// Use type from type annotation if one is present
const declaredType = tryGetTypeFromEffectiveTypeNode(declaration);
@@ -13991,14 +13991,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
return result;
}
function isJSDocOptionalParameter(node: ParameterDeclaration) {
return isInJSFile(node) && (
// node.type should only be a JSDocOptionalType when node is a parameter of a JSDocFunctionType
node.type && node.type.kind === SyntaxKind.JSDocOptionalType
|| getJSDocParameterTags(node).some(({ isBracketed, typeExpression }) =>
isBracketed || !!typeExpression && typeExpression.type.kind === SyntaxKind.JSDocOptionalType));
}
function tryFindAmbientModule(moduleName: string, withAugmentations: boolean) {
if (isExternalModuleNameRelative(moduleName)) {
return undefined;

View File

@@ -414,6 +414,7 @@ import {
PropertyDeclaration,
PropertyName,
PropertyNameLiteral,
PropertySignature,
PseudoBigInt,
QualifiedName,
ReadonlyCollection,
@@ -9139,3 +9140,26 @@ export function canUsePropertyAccess(name: string, languageVersion: ScriptTarget
export function hasTabstop(node: Node): boolean {
return getSnippetElement(node)?.kind === SnippetKind.TabStop;
}
export function isJSDocOptionalParameter(node: ParameterDeclaration) {
return isInJSFile(node) && (
// node.type should only be a JSDocOptionalType when node is a parameter of a JSDocFunctionType
node.type && node.type.kind === SyntaxKind.JSDocOptionalType
|| getJSDocParameterTags(node).some(({ isBracketed, typeExpression }) =>
isBracketed || !!typeExpression && typeExpression.type.kind === SyntaxKind.JSDocOptionalType));
}
export function isOptionalDeclaration(declaration: Declaration): boolean {
switch (declaration.kind) {
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.PropertySignature:
return !!(declaration as PropertyDeclaration | PropertySignature).questionToken;
case SyntaxKind.Parameter:
return !!(declaration as ParameterDeclaration).questionToken || isJSDocOptionalParameter(declaration as ParameterDeclaration);
case SyntaxKind.JSDocPropertyTag:
case SyntaxKind.JSDocParameterTag:
return isOptionalJSDocPropertyLikeTag(declaration);
default:
return false;
}
}