mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-16 07:13:45 -05:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user