Skip to content

Commit af3e1d4

Browse files
authored
Reuse type nodes from optional parameters even when not written as a union with undefined (#48605)
* Reuse type nodes from optional parameters and properties even when not written as a union with `undefined` * Remove newly unneeded NodeBuilderFlag * Update public API * Update baselines from main
1 parent 12c4ea8 commit af3e1d4

File tree

51 files changed

+246
-113
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+246
-113
lines changed

src/compiler/checker.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5915,9 +5915,6 @@ namespace ts {
59155915
if (parameterDeclaration && isRequiredInitializedParameter(parameterDeclaration)) {
59165916
parameterType = getOptionalType(parameterType);
59175917
}
5918-
if ((context.flags & NodeBuilderFlags.NoUndefinedOptionalParameterType) && parameterDeclaration && !isJSDocParameterTag(parameterDeclaration) && isOptionalUninitializedParameter(parameterDeclaration)) {
5919-
parameterType = getTypeWithFacts(parameterType, TypeFacts.NEUndefined);
5920-
}
59215918
const parameterTypeNode = serializeTypeForDeclaration(context, parameterType, parameterSymbol, context.enclosingDeclaration, privateSymbolVisitor, bundledImports);
59225919

59235920
const modifiers = !(context.flags & NodeBuilderFlags.OmitParameterModifiers) && preserveModifierFlags && parameterDeclaration && parameterDeclaration.modifiers ? parameterDeclaration.modifiers.map(factory.cloneNode) : undefined;
@@ -6544,7 +6541,7 @@ namespace ts {
65446541
if (declWithExistingAnnotation && !isFunctionLikeDeclaration(declWithExistingAnnotation) && !isGetAccessorDeclaration(declWithExistingAnnotation)) {
65456542
// try to reuse the existing annotation
65466543
const existing = getEffectiveTypeAnnotationNode(declWithExistingAnnotation)!;
6547-
if (getTypeFromTypeNode(existing) === type && existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(existing, type)) {
6544+
if (typeNodeIsEquivalentToType(existing, declWithExistingAnnotation, type) && existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(existing, type)) {
65486545
const result = serializeExistingTypeNode(context, existing, includePrivateSymbol, bundled);
65496546
if (result) {
65506547
return result;
@@ -6562,6 +6559,17 @@ namespace ts {
65626559
return result;
65636560
}
65646561

6562+
function typeNodeIsEquivalentToType(typeNode: TypeNode, annotatedDeclaration: Declaration, type: Type) {
6563+
const typeFromTypeNode = getTypeFromTypeNode(typeNode);
6564+
if (typeFromTypeNode === type) {
6565+
return true;
6566+
}
6567+
if (isParameter(annotatedDeclaration) && annotatedDeclaration.questionToken) {
6568+
return getTypeWithFacts(type, TypeFacts.NEUndefined) === typeFromTypeNode;
6569+
}
6570+
return false;
6571+
}
6572+
65656573
function serializeReturnTypeForSignature(context: NodeBuilderContext, type: Type, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
65666574
if (!isErrorType(type) && context.enclosingDeclaration) {
65676575
const annotation = signature.declaration && getEffectiveReturnTypeNode(signature.declaration);
@@ -42579,12 +42587,6 @@ namespace ts {
4257942587
hasSyntacticModifier(parameter, ModifierFlags.ParameterPropertyModifier);
4258042588
}
4258142589

42582-
function isOptionalUninitializedParameter(parameter: ParameterDeclaration) {
42583-
return !!strictNullChecks &&
42584-
isOptionalParameter(parameter) &&
42585-
!parameter.initializer;
42586-
}
42587-
4258842590
function isExpandoFunctionDeclaration(node: Declaration): boolean {
4258942591
const declaration = getParseTreeNode(node, isFunctionDeclaration);
4259042592
if (!declaration) {

src/compiler/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4490,7 +4490,6 @@ namespace ts {
44904490
UseAliasDefinedOutsideCurrentScope = 1 << 14, // Allow non-visible aliases
44914491
UseSingleQuotesForStringLiteralType = 1 << 28, // Use single quotes for string literal type
44924492
NoTypeReduction = 1 << 29, // Don't call getReducedType
4493-
NoUndefinedOptionalParameterType = 1 << 30, // Do not add undefined to optional parameter type
44944493

44954494
// Error handling
44964495
AllowThisInObjectLiteral = 1 << 15,

src/compiler/utilities.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7654,4 +7654,8 @@ namespace ts {
76547654

76557655
return state > States.NodeModules ? { topLevelNodeModulesIndex, topLevelPackageNameIndex, packageRootIndex, fileNameIndex } : undefined;
76567656
}
7657+
7658+
export function getParameterTypeNode(parameter: ParameterDeclaration | JSDocParameterTag) {
7659+
return parameter.kind === SyntaxKind.JSDocParameterTag ? parameter.typeExpression?.type : parameter.type;
7660+
}
76577661
}

src/services/codefixes/helpers.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ namespace ts.codefix {
194194
const scriptTarget = getEmitScriptTarget(program.getCompilerOptions());
195195
const flags =
196196
NodeBuilderFlags.NoTruncation
197-
| NodeBuilderFlags.NoUndefinedOptionalParameterType
198197
| NodeBuilderFlags.SuppressAnyReturnType
199198
| NodeBuilderFlags.AllowEmptyTuple
200199
| (quotePreference === QuotePreference.Single ? NodeBuilderFlags.UseSingleQuotesForStringLiteralType : NodeBuilderFlags.None);

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2394,7 +2394,6 @@ declare namespace ts {
23942394
UseAliasDefinedOutsideCurrentScope = 16384,
23952395
UseSingleQuotesForStringLiteralType = 268435456,
23962396
NoTypeReduction = 536870912,
2397-
NoUndefinedOptionalParameterType = 1073741824,
23982397
AllowThisInObjectLiteral = 32768,
23992398
AllowQualifiedNameInPlaceOfIdentifier = 65536,
24002399
/** @deprecated AllowQualifedNameInPlaceOfIdentifier. Use AllowQualifiedNameInPlaceOfIdentifier instead. */

tests/baselines/reference/api/typescript.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2394,7 +2394,6 @@ declare namespace ts {
23942394
UseAliasDefinedOutsideCurrentScope = 16384,
23952395
UseSingleQuotesForStringLiteralType = 268435456,
23962396
NoTypeReduction = 536870912,
2397-
NoUndefinedOptionalParameterType = 1073741824,
23982397
AllowThisInObjectLiteral = 32768,
23992398
AllowQualifiedNameInPlaceOfIdentifier = 65536,
24002399
/** @deprecated AllowQualifedNameInPlaceOfIdentifier. Use AllowQualifiedNameInPlaceOfIdentifier instead. */

tests/baselines/reference/arrayFakeFlatNoCrashInferenceDeclarations.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type BadFlatArray<Arr, Depth extends number> = {obj: {
1919
>1 : 1
2020

2121
declare function flat<A, D extends number = 1>(
22-
>flat : <A, D extends number = 1>(arr: A, depth?: D | undefined) => BadFlatArray<A, D>[]
22+
>flat : <A, D extends number = 1>(arr: A, depth?: D) => BadFlatArray<A, D>[]
2323

2424
arr: A,
2525
>arr : A

tests/baselines/reference/assertionTypePredicates1.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ namespace Debug {
270270
>Debug : typeof Debug
271271

272272
export declare function assert(value: unknown, message?: string): asserts value;
273-
>assert : (value: unknown, message?: string | undefined) => asserts value
273+
>assert : (value: unknown, message?: string) => asserts value
274274
>value : unknown
275275
>message : string | undefined
276276

tests/baselines/reference/asyncFunctionsAndStrictNullChecks.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ declare function resolve2<T>(value: T): Windows.Foundation.IPromise<T>;
7575
>Foundation : any
7676

7777
async function sample2(x?: number) {
78-
>sample2 : (x?: number | undefined) => Promise<void>
78+
>sample2 : (x?: number) => Promise<void>
7979
>x : number | undefined
8080

8181
let x1 = await resolve1(x);

tests/baselines/reference/callsOnComplexSignatures.types

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ function test3(items: string[] | number[]) {
110110
}
111111

112112
function test4(
113-
>test4 : (arg1: ((...objs: { x: number;}[]) => number) | ((...objs: { y: number;}[]) => number), arg2: ((a: { x: number;}, b: object) => number) | ((a: object, b: { x: number;}) => number), arg3: ((a: { x: number;}, ...objs: { y: number;}[]) => number) | ((...objs: { x: number;}[]) => number), arg4: ((a?: { x: number; } | undefined, b?: { x: number; } | undefined) => number) | ((a?: { y: number; } | undefined) => number), arg5: ((a?: { x: number; } | undefined, ...b: { x: number;}[]) => number) | ((a?: { y: number; } | undefined) => number), arg6: ((a?: { x: number; } | undefined, b?: { x: number; } | undefined) => number) | ((...a: { y: number;}[]) => number)) => void
113+
>test4 : (arg1: ((...objs: { x: number;}[]) => number) | ((...objs: { y: number;}[]) => number), arg2: ((a: { x: number;}, b: object) => number) | ((a: object, b: { x: number;}) => number), arg3: ((a: { x: number;}, ...objs: { y: number;}[]) => number) | ((...objs: { x: number;}[]) => number), arg4: ((a?: { x: number;}, b?: { x: number;}) => number) | ((a?: { y: number;}) => number), arg5: ((a?: { x: number;}, ...b: { x: number;}[]) => number) | ((a?: { y: number;}) => number), arg6: ((a?: { x: number;}, b?: { x: number;}) => number) | ((...a: { y: number;}[]) => number)) => void
114114

115115
arg1: ((...objs: {x: number}[]) => number) | ((...objs: {y: number}[]) => number),
116116
>arg1 : ((...objs: { x: number;}[]) => number) | ((...objs: { y: number;}[]) => number)
@@ -138,7 +138,7 @@ function test4(
138138
>x : number
139139

140140
arg4: ((a?: {x: number}, b?: {x: number}) => number) | ((a?: {y: number}) => number),
141-
>arg4 : ((a?: { x: number; } | undefined, b?: { x: number; } | undefined) => number) | ((a?: { y: number; } | undefined) => number)
141+
>arg4 : ((a?: { x: number;}, b?: { x: number;}) => number) | ((a?: { y: number;}) => number)
142142
>a : { x: number; } | undefined
143143
>x : number
144144
>b : { x: number; } | undefined
@@ -147,7 +147,7 @@ function test4(
147147
>y : number
148148

149149
arg5: ((a?: {x: number}, ...b: {x: number}[]) => number) | ((a?: {y: number}) => number),
150-
>arg5 : ((a?: { x: number; } | undefined, ...b: { x: number;}[]) => number) | ((a?: { y: number; } | undefined) => number)
150+
>arg5 : ((a?: { x: number;}, ...b: { x: number;}[]) => number) | ((a?: { y: number;}) => number)
151151
>a : { x: number; } | undefined
152152
>x : number
153153
>b : { x: number; }[]
@@ -156,7 +156,7 @@ function test4(
156156
>y : number
157157

158158
arg6: ((a?: {x: number}, b?: {x: number}) => number) | ((...a: {y: number}[]) => number),
159-
>arg6 : ((a?: { x: number; } | undefined, b?: { x: number; } | undefined) => number) | ((...a: { y: number;}[]) => number)
159+
>arg6 : ((a?: { x: number;}, b?: { x: number;}) => number) | ((...a: { y: number;}[]) => number)
160160
>a : { x: number; } | undefined
161161
>x : number
162162
>b : { x: number; } | undefined
@@ -339,7 +339,7 @@ function test5() {
339339

340340
// Pair of non-like intrinsics
341341
function render(url?: string): React.ReactNode {
342-
>render : (url?: string | undefined) => React.ReactNode
342+
>render : (url?: string) => React.ReactNode
343343
>url : string | undefined
344344
>React : any
345345

tests/baselines/reference/circularOptionalityRemoval.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function fn1(x: number | undefined = x > 0 ? x : 0) { }
1212

1313
// Report from user
1414
function fn2(x?: string = someCondition ? 'value1' : x) { }
15-
>fn2 : (x?: string | undefined) => void
15+
>fn2 : (x?: string) => void
1616
>x : string | undefined
1717
>someCondition ? 'value1' : x : string | undefined
1818
>someCondition : any

tests/baselines/reference/contextuallyTypedParametersWithInitializers.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ declare function id4<T extends (x: { foo?: number }) => any>(input: T): T;
2121
>input : T
2222

2323
declare function id5<T extends (x?: number) => any>(input: T): T;
24-
>id5 : <T extends (x?: number | undefined) => any>(input: T) => T
24+
>id5 : <T extends (x?: number) => any>(input: T) => T
2525
>x : number | undefined
2626
>input : T
2727

tests/baselines/reference/controlFlowAliasing.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ function f27(outer: { obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: nu
532532
}
533533

534534
function f28(obj?: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
535-
>f28 : (obj?: { kind: 'foo'; foo: string; } | { kind: 'bar'; bar: number; } | undefined) => void
535+
>f28 : (obj?: { kind: 'foo'; foo: string;} | { kind: 'bar'; bar: number;}) => void
536536
>obj : { kind: 'foo'; foo: string; } | { kind: 'bar'; bar: number; } | undefined
537537
>kind : "foo"
538538
>foo : string

tests/baselines/reference/controlFlowForIndexSignatures.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const boo: Foo = { bar: 'bar' };
1010
>'bar' : "bar"
1111

1212
function a(aboo1?: Foo) {
13-
>a : (aboo1?: Foo | undefined) => void
13+
>a : (aboo1?: Foo) => void
1414
>aboo1 : Foo | undefined
1515

1616
if (!aboo1) return;

tests/baselines/reference/controlFlowOptionalChain.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1882,7 +1882,7 @@ type Shape =
18821882
>radius : number
18831883

18841884
function getArea(shape?: Shape) {
1885-
>getArea : (shape?: Shape | undefined) => number
1885+
>getArea : (shape?: Shape) => number
18861886
>shape : Shape | undefined
18871887

18881888
switch (shape?.type) {

tests/baselines/reference/defaultParameterAddsUndefinedWithStrictNullChecks.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
=== tests/cases/compiler/defaultParameterAddsUndefinedWithStrictNullChecks.ts ===
22
function f(addUndefined1 = "J", addUndefined2?: number) {
3-
>f : (addUndefined1?: string, addUndefined2?: number | undefined) => number
3+
>f : (addUndefined1?: string, addUndefined2?: number) => number
44
>addUndefined1 : string
55
>"J" : "J"
66
>addUndefined2 : number | undefined

tests/baselines/reference/destructureOptionalParameter.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
=== tests/cases/compiler/destructureOptionalParameter.ts ===
22
declare function f1({ a, b }?: { a: number, b: string }): void;
3-
>f1 : ({ a, b }?: { a: number; b: string; } | undefined) => void
3+
>f1 : ({ a, b }?: { a: number; b: string;}) => void
44
>a : number
55
>b : string
66
>a : number

tests/baselines/reference/destructuringAssignmentWithDefault.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ function f1(options?: { color?: string, width?: number }) {
6161
}
6262

6363
function f2(options?: [string?, number?]) {
64-
>f2 : (options?: [(string | undefined)?, (number | undefined)?] | undefined) => void
64+
>f2 : (options?: [string?, number?]) => void
6565
>options : [(string | undefined)?, (number | undefined)?] | undefined
6666

6767
let [str, num] = options || [];
@@ -133,7 +133,7 @@ function f3(options?: { color: string, width: number }) {
133133
}
134134

135135
function f4(options?: [string, number]) {
136-
>f4 : (options?: [string, number] | undefined) => void
136+
>f4 : (options?: [string, number]) => void
137137
>options : [string, number] | undefined
138138

139139
let [str, num] = options || [];

tests/baselines/reference/genericFunctionInference1.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ const fn20 = pipe((_a?: {}) => 1);
801801
>fn20 : (_a?: {} | undefined) => number
802802
>pipe((_a?: {}) => 1) : (_a?: {} | undefined) => number
803803
>pipe : { <A extends any[], B>(ab: (...args: A) => B): (...args: A) => B; <A extends any[], B, C>(ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C; <A extends any[], B, C, D>(ab: (...args: A) => B, bc: (b: B) => C, cd: (c: C) => D): (...args: A) => D; }
804-
>(_a?: {}) => 1 : (_a?: {} | undefined) => number
804+
>(_a?: {}) => 1 : (_a?: {}) => number
805805
>_a : {} | undefined
806806
>1 : 1
807807

@@ -968,7 +968,7 @@ const fn62 = pipe(
968968
// Repro from #30297
969969

970970
declare function foo2<T, U = T>(fn: T, a?: U, b?: U): [T, U];
971-
>foo2 : <T, U = T>(fn: T, a?: U | undefined, b?: U | undefined) => [T, U]
971+
>foo2 : <T, U = T>(fn: T, a?: U, b?: U) => [T, U]
972972
>fn : T
973973
>a : U | undefined
974974
>b : U | undefined

tests/baselines/reference/genericRestParameters1.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ f23();
570570
>f23 : () => string[]
571571

572572
declare const g20: (x: number, y?: string, z?: boolean) => string[];
573-
>g20 : (x: number, y?: string | undefined, z?: boolean | undefined) => string[]
573+
>g20 : (x: number, y?: string, z?: boolean) => string[]
574574
>x : number
575575
>y : string | undefined
576576
>z : boolean | undefined

tests/baselines/reference/indexedAccessNormalization.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type MyMap<M extends object> = {
1111
}
1212

1313
declare function g<T>(value?: T): void;
14-
>g : <T>(value?: T | undefined) => void
14+
>g : <T>(value?: T) => void
1515
>value : T | undefined
1616

1717
function f1<M extends object>(mymap: MyMap<M>, k: keyof M) {

tests/baselines/reference/inferFromBindingPattern.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ interface Person {
6060
}
6161

6262
declare function selectJohn<K = Person>(props?: SelectProps<Person, K>): SelectResult<Person, K>;
63-
>selectJohn : <K = Person>(props?: SelectProps<Person, K> | undefined) => SelectResult<Person, K>
63+
>selectJohn : <K = Person>(props?: SelectProps<Person, K>) => SelectResult<Person, K>
6464
>props : SelectProps<Person, K> | undefined
6565

6666
const [person] = selectJohn();
@@ -91,7 +91,7 @@ declare function makeTuple<T1>(arg: T1): [T1];
9191
>arg : T1
9292

9393
declare function stringy<T = string>(arg?: T): T;
94-
>stringy : <T = string>(arg?: T | undefined) => T
94+
>stringy : <T = string>(arg?: T) => T
9595
>arg : T | undefined
9696

9797
const isStringTuple = makeTuple(stringy()); // [string]

tests/baselines/reference/inferenceErasedSignatures.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ abstract class SomeAbstractClass<C, M, R> extends SomeBaseClass {
1515
>SomeBaseClass : SomeBaseClass
1616

1717
foo!: (r?: R) => void;
18-
>foo : (r?: R | undefined) => void
18+
>foo : (r?: R) => void
1919
>r : R | undefined
2020

2121
bar!: (r?: any) => void;
@@ -72,7 +72,7 @@ interface BaseType<T1, T2> {
7272
>c : T1
7373

7474
useT2(r?: T2): void;
75-
>useT2 : (r?: T2 | undefined) => void
75+
>useT2 : (r?: T2) => void
7676
>r : T2 | undefined
7777

7878
unrelatedButSomehowRelevant(r?: any): void;
@@ -99,7 +99,7 @@ interface StructuralVersion {
9999
>c : number
100100

101101
useT2(r?: boolean): void;
102-
>useT2 : (r?: boolean | undefined) => void
102+
>useT2 : (r?: boolean) => void
103103
>r : boolean | undefined
104104

105105
unrelatedButSomehowRelevant(r?: any): void;

tests/baselines/reference/initializedParameterBeforeNonoptionalNotOptional.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
=== tests/cases/compiler/index.d.ts ===
22
export declare function foo({a}?: {
3-
>foo : ({ a }?: { a?: string | undefined; } | undefined) => void
3+
>foo : ({ a }?: { a?: string;}) => void
44
>a : string | undefined
55

66
a?: string;

tests/baselines/reference/intersectionWithConflictingPrivates.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class Foo {
138138
}
139139

140140
private async bar(node: CommitFileNode | ResultsFileNode | StashFileNode | StatusFileNode, options?: {}) {
141-
>bar : (node: CommitFileNode | ResultsFileNode | StashFileNode | StatusFileNode, options?: {} | undefined) => Promise<undefined>
141+
>bar : (node: CommitFileNode | ResultsFileNode | StashFileNode | StatusFileNode, options?: {}) => Promise<undefined>
142142
>node : CommitFileNode | ResultsFileNode | StashFileNode | StatusFileNode
143143
>options : {} | undefined
144144

tests/baselines/reference/jsDeclarationsReactComponents.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ declare const TabbedShowLayout: {
216216
};
217217
} & ((props?: {
218218
elem: string;
219-
} | undefined) => JSX.Element);
219+
}) => JSX.Element);
220220
//// [jsDeclarationsReactComponents4.d.ts]
221221
export default TabbedShowLayout;
222222
declare function TabbedShowLayout(prop: {

0 commit comments

Comments
 (0)