Skip to content

Commit b8baf48

Browse files
authored
Fix assignment of intersections to objects with optional properties (#37195)
* Treat intersections of only objects as a single object in relations * Exclude intersections containing non-inferrable types * Accept new baselines * Update test * Accept new baselines * Add tests
1 parent ad8d3d9 commit b8baf48

11 files changed

+265
-31
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15415,7 +15415,9 @@ namespace ts {
1541515415
//
1541615416
// - For a primitive type or type parameter (such as 'number = A & B') there is no point in
1541715417
// breaking the intersection apart.
15418-
result = someTypeRelatedToType(<IntersectionType>source, target, /*reportErrors*/ false, IntersectionState.Source);
15418+
if (!isNonGenericObjectType(target) || !every((<IntersectionType>source).types, t => isNonGenericObjectType(t) && !(getObjectFlags(t) & ObjectFlags.NonInferrableType))) {
15419+
result = someTypeRelatedToType(<IntersectionType>source, target, /*reportErrors*/ false, IntersectionState.Source);
15420+
}
1541915421
}
1542015422
if (!result && (source.flags & TypeFlags.StructuredOrInstantiable || target.flags & TypeFlags.StructuredOrInstantiable)) {
1542115423
if (result = recursiveTypeRelatedTo(source, target, reportErrors, intersectionState)) {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
tests/cases/compiler/intersectionsAndOptionalProperties.ts(5,1): error TS2322: Type '{ a: null; b: string; }' is not assignable to type '{ a?: number | undefined; b: string; }'.
2+
Types of property 'a' are incompatible.
3+
Type 'null' is not assignable to type 'number | undefined'.
4+
tests/cases/compiler/intersectionsAndOptionalProperties.ts(6,1): error TS2322: Type '{ a: null; } & { b: string; }' is not assignable to type '{ a?: number | undefined; b: string; }'.
5+
Types of property 'a' are incompatible.
6+
Type 'null' is not assignable to type 'number | undefined'.
7+
tests/cases/compiler/intersectionsAndOptionalProperties.ts(19,5): error TS2322: Type 'From' is not assignable to type 'To'.
8+
Types of property 'field' are incompatible.
9+
Type 'null' is not assignable to type 'number | undefined'.
10+
tests/cases/compiler/intersectionsAndOptionalProperties.ts(20,5): error TS2322: Type 'null' is not assignable to type 'number | undefined'.
11+
12+
13+
==== tests/cases/compiler/intersectionsAndOptionalProperties.ts (4 errors) ====
14+
declare let x: { a?: number, b: string };
15+
declare let y: { a: null, b: string };
16+
declare let z: { a: null } & { b: string };
17+
18+
x = y; // Error
19+
~
20+
!!! error TS2322: Type '{ a: null; b: string; }' is not assignable to type '{ a?: number | undefined; b: string; }'.
21+
!!! error TS2322: Types of property 'a' are incompatible.
22+
!!! error TS2322: Type 'null' is not assignable to type 'number | undefined'.
23+
x = z; // Error
24+
~
25+
!!! error TS2322: Type '{ a: null; } & { b: string; }' is not assignable to type '{ a?: number | undefined; b: string; }'.
26+
!!! error TS2322: Types of property 'a' are incompatible.
27+
!!! error TS2322: Type 'null' is not assignable to type 'number | undefined'.
28+
29+
// Repro from #36604
30+
31+
interface To {
32+
field?: number;
33+
anotherField: string;
34+
}
35+
36+
type From = { field: null } & Omit<To, 'field'>;
37+
38+
function foo(v: From) {
39+
let x: To;
40+
x = v; // Error
41+
~
42+
!!! error TS2322: Type 'From' is not assignable to type 'To'.
43+
!!! error TS2322: Types of property 'field' are incompatible.
44+
!!! error TS2322: Type 'null' is not assignable to type 'number | undefined'.
45+
x.field = v.field; // Error
46+
~~~~~~~
47+
!!! error TS2322: Type 'null' is not assignable to type 'number | undefined'.
48+
}
49+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//// [intersectionsAndOptionalProperties.ts]
2+
declare let x: { a?: number, b: string };
3+
declare let y: { a: null, b: string };
4+
declare let z: { a: null } & { b: string };
5+
6+
x = y; // Error
7+
x = z; // Error
8+
9+
// Repro from #36604
10+
11+
interface To {
12+
field?: number;
13+
anotherField: string;
14+
}
15+
16+
type From = { field: null } & Omit<To, 'field'>;
17+
18+
function foo(v: From) {
19+
let x: To;
20+
x = v; // Error
21+
x.field = v.field; // Error
22+
}
23+
24+
25+
//// [intersectionsAndOptionalProperties.js]
26+
"use strict";
27+
x = y; // Error
28+
x = z; // Error
29+
function foo(v) {
30+
var x;
31+
x = v; // Error
32+
x.field = v.field; // Error
33+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
=== tests/cases/compiler/intersectionsAndOptionalProperties.ts ===
2+
declare let x: { a?: number, b: string };
3+
>x : Symbol(x, Decl(intersectionsAndOptionalProperties.ts, 0, 11))
4+
>a : Symbol(a, Decl(intersectionsAndOptionalProperties.ts, 0, 16))
5+
>b : Symbol(b, Decl(intersectionsAndOptionalProperties.ts, 0, 28))
6+
7+
declare let y: { a: null, b: string };
8+
>y : Symbol(y, Decl(intersectionsAndOptionalProperties.ts, 1, 11))
9+
>a : Symbol(a, Decl(intersectionsAndOptionalProperties.ts, 1, 16))
10+
>b : Symbol(b, Decl(intersectionsAndOptionalProperties.ts, 1, 25))
11+
12+
declare let z: { a: null } & { b: string };
13+
>z : Symbol(z, Decl(intersectionsAndOptionalProperties.ts, 2, 11))
14+
>a : Symbol(a, Decl(intersectionsAndOptionalProperties.ts, 2, 16))
15+
>b : Symbol(b, Decl(intersectionsAndOptionalProperties.ts, 2, 30))
16+
17+
x = y; // Error
18+
>x : Symbol(x, Decl(intersectionsAndOptionalProperties.ts, 0, 11))
19+
>y : Symbol(y, Decl(intersectionsAndOptionalProperties.ts, 1, 11))
20+
21+
x = z; // Error
22+
>x : Symbol(x, Decl(intersectionsAndOptionalProperties.ts, 0, 11))
23+
>z : Symbol(z, Decl(intersectionsAndOptionalProperties.ts, 2, 11))
24+
25+
// Repro from #36604
26+
27+
interface To {
28+
>To : Symbol(To, Decl(intersectionsAndOptionalProperties.ts, 5, 6))
29+
30+
field?: number;
31+
>field : Symbol(To.field, Decl(intersectionsAndOptionalProperties.ts, 9, 14))
32+
33+
anotherField: string;
34+
>anotherField : Symbol(To.anotherField, Decl(intersectionsAndOptionalProperties.ts, 10, 19))
35+
}
36+
37+
type From = { field: null } & Omit<To, 'field'>;
38+
>From : Symbol(From, Decl(intersectionsAndOptionalProperties.ts, 12, 1))
39+
>field : Symbol(field, Decl(intersectionsAndOptionalProperties.ts, 14, 14))
40+
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
41+
>To : Symbol(To, Decl(intersectionsAndOptionalProperties.ts, 5, 6))
42+
43+
function foo(v: From) {
44+
>foo : Symbol(foo, Decl(intersectionsAndOptionalProperties.ts, 14, 49))
45+
>v : Symbol(v, Decl(intersectionsAndOptionalProperties.ts, 16, 13))
46+
>From : Symbol(From, Decl(intersectionsAndOptionalProperties.ts, 12, 1))
47+
48+
let x: To;
49+
>x : Symbol(x, Decl(intersectionsAndOptionalProperties.ts, 17, 7))
50+
>To : Symbol(To, Decl(intersectionsAndOptionalProperties.ts, 5, 6))
51+
52+
x = v; // Error
53+
>x : Symbol(x, Decl(intersectionsAndOptionalProperties.ts, 17, 7))
54+
>v : Symbol(v, Decl(intersectionsAndOptionalProperties.ts, 16, 13))
55+
56+
x.field = v.field; // Error
57+
>x.field : Symbol(To.field, Decl(intersectionsAndOptionalProperties.ts, 9, 14))
58+
>x : Symbol(x, Decl(intersectionsAndOptionalProperties.ts, 17, 7))
59+
>field : Symbol(To.field, Decl(intersectionsAndOptionalProperties.ts, 9, 14))
60+
>v.field : Symbol(field, Decl(intersectionsAndOptionalProperties.ts, 14, 14))
61+
>v : Symbol(v, Decl(intersectionsAndOptionalProperties.ts, 16, 13))
62+
>field : Symbol(field, Decl(intersectionsAndOptionalProperties.ts, 14, 14))
63+
}
64+
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
=== tests/cases/compiler/intersectionsAndOptionalProperties.ts ===
2+
declare let x: { a?: number, b: string };
3+
>x : { a?: number | undefined; b: string; }
4+
>a : number | undefined
5+
>b : string
6+
7+
declare let y: { a: null, b: string };
8+
>y : { a: null; b: string; }
9+
>a : null
10+
>null : null
11+
>b : string
12+
13+
declare let z: { a: null } & { b: string };
14+
>z : { a: null; } & { b: string; }
15+
>a : null
16+
>null : null
17+
>b : string
18+
19+
x = y; // Error
20+
>x = y : { a: null; b: string; }
21+
>x : { a?: number | undefined; b: string; }
22+
>y : { a: null; b: string; }
23+
24+
x = z; // Error
25+
>x = z : { a: null; } & { b: string; }
26+
>x : { a?: number | undefined; b: string; }
27+
>z : { a: null; } & { b: string; }
28+
29+
// Repro from #36604
30+
31+
interface To {
32+
field?: number;
33+
>field : number | undefined
34+
35+
anotherField: string;
36+
>anotherField : string
37+
}
38+
39+
type From = { field: null } & Omit<To, 'field'>;
40+
>From : From
41+
>field : null
42+
>null : null
43+
44+
function foo(v: From) {
45+
>foo : (v: From) => void
46+
>v : From
47+
48+
let x: To;
49+
>x : To
50+
51+
x = v; // Error
52+
>x = v : From
53+
>x : To
54+
>v : From
55+
56+
x.field = v.field; // Error
57+
>x.field = v.field : null
58+
>x.field : number | undefined
59+
>x : To
60+
>field : number | undefined
61+
>v.field : null
62+
>v : From
63+
>field : null
64+
}
65+

tests/baselines/reference/normalizedIntersectionTooComplex.errors.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
tests/cases/compiler/normalizedIntersectionTooComplex.ts(36,14): error TS2590: Expression produces a union type that is too complex to represent.
12
tests/cases/compiler/normalizedIntersectionTooComplex.ts(36,40): error TS7006: Parameter 'x' implicitly has an 'any' type.
2-
tests/cases/compiler/normalizedIntersectionTooComplex.ts(36,40): error TS2590: Expression produces a union type that is too complex to represent.
33

44

55
==== tests/cases/compiler/normalizedIntersectionTooComplex.ts (2 errors) ====
@@ -39,8 +39,8 @@ tests/cases/compiler/normalizedIntersectionTooComplex.ts(36,40): error TS2590: E
3939
declare var all: keyof Big;
4040
const ctor = getCtor(all);
4141
const comp = ctor({ common: "ok", ref: x => console.log(x) });
42+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43+
!!! error TS2590: Expression produces a union type that is too complex to represent.
4244
~
4345
!!! error TS7006: Parameter 'x' implicitly has an 'any' type.
44-
~~~~~~~~~~~~~~~~~~~
45-
!!! error TS2590: Expression produces a union type that is too complex to represent.
4646

tests/baselines/reference/propTypeValidatorInference.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface Validator<T> {
1414
[nominalTypeHack]?: T;
1515
}
1616

17-
export interface Requireable<T> extends Validator<T | undefined | null> {
17+
export interface Requireable<T> extends Validator<T> {
1818
isRequired: Validator<NonNullable<T>>;
1919
}
2020

tests/baselines/reference/propTypeValidatorInference.symbols

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ export interface Validator<T> {
5959
>T : Symbol(T, Decl(index.d.ts, 8, 27))
6060
}
6161

62-
export interface Requireable<T> extends Validator<T | undefined | null> {
62+
export interface Requireable<T> extends Validator<T> {
6363
>Requireable : Symbol(Requireable, Decl(index.d.ts, 11, 1))
6464
>T : Symbol(T, Decl(index.d.ts, 13, 29))
6565
>Validator : Symbol(Validator, Decl(index.d.ts, 6, 72))
6666
>T : Symbol(T, Decl(index.d.ts, 13, 29))
6767

6868
isRequired: Validator<NonNullable<T>>;
69-
>isRequired : Symbol(Requireable.isRequired, Decl(index.d.ts, 13, 73))
69+
>isRequired : Symbol(Requireable.isRequired, Decl(index.d.ts, 13, 54))
7070
>Validator : Symbol(Validator, Decl(index.d.ts, 6, 72))
7171
>NonNullable : Symbol(NonNullable, Decl(lib.es5.d.ts, --, --))
7272
>T : Symbol(T, Decl(index.d.ts, 13, 29))
@@ -202,11 +202,11 @@ const innerProps = {
202202

203203
foo: PropTypes.string.isRequired,
204204
>foo : Symbol(foo, Decl(file.ts, 18, 20))
205-
>PropTypes.string.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
205+
>PropTypes.string.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
206206
>PropTypes.string : Symbol(PropTypes.string, Decl(index.d.ts, 27, 12))
207207
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
208208
>string : Symbol(PropTypes.string, Decl(index.d.ts, 27, 12))
209-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
209+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
210210

211211
bar: PropTypes.bool,
212212
>bar : Symbol(bar, Decl(file.ts, 19, 37))
@@ -242,11 +242,11 @@ const arrayOfTypes = [PropTypes.string, PropTypes.bool, PropTypes.shape({
242242

243243
bar: PropTypes.number.isRequired
244244
>bar : Symbol(bar, Decl(file.ts, 25, 26))
245-
>PropTypes.number.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
245+
>PropTypes.number.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
246246
>PropTypes.number : Symbol(PropTypes.number, Decl(index.d.ts, 28, 12))
247247
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
248248
>number : Symbol(PropTypes.number, Decl(index.d.ts, 28, 12))
249-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
249+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
250250

251251
})];
252252

@@ -263,37 +263,37 @@ const propTypes: PropTypesMap = {
263263

264264
array: PropTypes.array.isRequired,
265265
>array : Symbol(array, Decl(file.ts, 31, 23))
266-
>PropTypes.array.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
266+
>PropTypes.array.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
267267
>PropTypes.array : Symbol(PropTypes.array, Decl(index.d.ts, 25, 12))
268268
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
269269
>array : Symbol(PropTypes.array, Decl(index.d.ts, 25, 12))
270-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
270+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
271271

272272
bool: PropTypes.bool.isRequired,
273273
>bool : Symbol(bool, Decl(file.ts, 32, 38))
274-
>PropTypes.bool.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
274+
>PropTypes.bool.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
275275
>PropTypes.bool : Symbol(PropTypes.bool, Decl(index.d.ts, 26, 12))
276276
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
277277
>bool : Symbol(PropTypes.bool, Decl(index.d.ts, 26, 12))
278-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
278+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
279279

280280
shape: PropTypes.shape(innerProps).isRequired,
281281
>shape : Symbol(shape, Decl(file.ts, 33, 36))
282-
>PropTypes.shape(innerProps).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
282+
>PropTypes.shape(innerProps).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
283283
>PropTypes.shape : Symbol(PropTypes.shape, Decl(index.d.ts, 28, 41))
284284
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
285285
>shape : Symbol(PropTypes.shape, Decl(index.d.ts, 28, 41))
286286
>innerProps : Symbol(innerProps, Decl(file.ts, 18, 5))
287-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
287+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
288288

289289
oneOfType: PropTypes.oneOfType(arrayOfTypes).isRequired,
290290
>oneOfType : Symbol(oneOfType, Decl(file.ts, 34, 50))
291-
>PropTypes.oneOfType(arrayOfTypes).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
291+
>PropTypes.oneOfType(arrayOfTypes).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
292292
>PropTypes.oneOfType : Symbol(PropTypes.oneOfType, Decl(index.d.ts, 29, 89))
293293
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
294294
>oneOfType : Symbol(PropTypes.oneOfType, Decl(index.d.ts, 29, 89))
295295
>arrayOfTypes : Symbol(arrayOfTypes, Decl(file.ts, 24, 5))
296-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
296+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
297297

298298
};
299299

@@ -309,37 +309,37 @@ const propTypesWithoutAnnotation = {
309309

310310
array: PropTypes.array.isRequired,
311311
>array : Symbol(array, Decl(file.ts, 40, 23))
312-
>PropTypes.array.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
312+
>PropTypes.array.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
313313
>PropTypes.array : Symbol(PropTypes.array, Decl(index.d.ts, 25, 12))
314314
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
315315
>array : Symbol(PropTypes.array, Decl(index.d.ts, 25, 12))
316-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
316+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
317317

318318
bool: PropTypes.bool.isRequired,
319319
>bool : Symbol(bool, Decl(file.ts, 41, 38))
320-
>PropTypes.bool.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
320+
>PropTypes.bool.isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
321321
>PropTypes.bool : Symbol(PropTypes.bool, Decl(index.d.ts, 26, 12))
322322
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
323323
>bool : Symbol(PropTypes.bool, Decl(index.d.ts, 26, 12))
324-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
324+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
325325

326326
shape: PropTypes.shape(innerProps).isRequired,
327327
>shape : Symbol(shape, Decl(file.ts, 42, 36))
328-
>PropTypes.shape(innerProps).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
328+
>PropTypes.shape(innerProps).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
329329
>PropTypes.shape : Symbol(PropTypes.shape, Decl(index.d.ts, 28, 41))
330330
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
331331
>shape : Symbol(PropTypes.shape, Decl(index.d.ts, 28, 41))
332332
>innerProps : Symbol(innerProps, Decl(file.ts, 18, 5))
333-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
333+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
334334

335335
oneOfType: PropTypes.oneOfType(arrayOfTypes).isRequired,
336336
>oneOfType : Symbol(oneOfType, Decl(file.ts, 43, 50))
337-
>PropTypes.oneOfType(arrayOfTypes).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
337+
>PropTypes.oneOfType(arrayOfTypes).isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
338338
>PropTypes.oneOfType : Symbol(PropTypes.oneOfType, Decl(index.d.ts, 29, 89))
339339
>PropTypes : Symbol(PropTypes, Decl(file.ts, 0, 6))
340340
>oneOfType : Symbol(PropTypes.oneOfType, Decl(index.d.ts, 29, 89))
341341
>arrayOfTypes : Symbol(arrayOfTypes, Decl(file.ts, 24, 5))
342-
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 73))
342+
>isRequired : Symbol(PropTypes.Requireable.isRequired, Decl(index.d.ts, 13, 54))
343343

344344
};
345345

0 commit comments

Comments
 (0)