Skip to content

Commit f9a05a1

Browse files
committed
Re-enable weak type check for intersection props
Previously, intersections disabled the weak type check for their constituents, and all properties (recursively) of their constituents. Also add test for this case.
1 parent 548f92a commit f9a05a1

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9352,7 +9352,10 @@ namespace ts {
93529352
}
93539353
return Ternary.False;
93549354
}
9355+
const saveDisableWeakTypeErrors = disableWeakTypeErrors;
9356+
disableWeakTypeErrors = false;
93559357
const related = isRelatedTo(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp), reportErrors);
9358+
disableWeakTypeErrors = saveDisableWeakTypeErrors;
93569359
if (!related) {
93579360
if (reportErrors) {
93589361
reportError(Diagnostics.Types_of_property_0_are_incompatible, symbolToString(targetProp));

tests/baselines/reference/weakType.errors.txt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
tests/cases/compiler/weakType.ts(31,18): error TS2345: Argument of type '{ error?: number; }' is not assignable to parameter of type 'ChangeOptions'.
22
Weak type 'ChangeOptions' has no properties in common with '{ error?: number; }'.
3+
tests/cases/compiler/weakType.ts(56,5): error TS2322: Type '{ properties: { wrong: string; }; }' is not assignable to type 'Weak & Spoiler'.
4+
Type '{ properties: { wrong: string; }; }' is not assignable to type 'Weak'.
5+
Types of property 'properties' are incompatible.
6+
Type '{ wrong: string; }' is not assignable to type '{ b?: number; }'.
7+
Weak type '{ b?: number; }' has no properties in common with '{ wrong: string; }'.
38

49

5-
==== tests/cases/compiler/weakType.ts (1 errors) ====
10+
==== tests/cases/compiler/weakType.ts (2 errors) ====
611
interface Settings {
712
timeout?: number;
813
onError?(): void;
@@ -48,4 +53,24 @@ tests/cases/compiler/weakType.ts(31,18): error TS2345: Argument of type '{ error
4853
n?: number
4954
}
5055
let ctor: Ctor = K
56+
57+
type Spoiler = { nope?: string }
58+
type Weak = {
59+
a?: number
60+
properties?: {
61+
b?: number
62+
}
63+
}
64+
declare let unknown: {
65+
properties: {
66+
wrong: string
67+
}
68+
}
69+
let weak: Weak & Spoiler = unknown
70+
~~~~
71+
!!! error TS2322: Type '{ properties: { wrong: string; }; }' is not assignable to type 'Weak & Spoiler'.
72+
!!! error TS2322: Type '{ properties: { wrong: string; }; }' is not assignable to type 'Weak'.
73+
!!! error TS2322: Types of property 'properties' are incompatible.
74+
!!! error TS2322: Type '{ wrong: string; }' is not assignable to type '{ b?: number; }'.
75+
!!! error TS2322: Weak type '{ b?: number; }' has no properties in common with '{ wrong: string; }'.
5176

tests/baselines/reference/weakType.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@ interface Ctor {
4141
n?: number
4242
}
4343
let ctor: Ctor = K
44+
45+
type Spoiler = { nope?: string }
46+
type Weak = {
47+
a?: number
48+
properties?: {
49+
b?: number
50+
}
51+
}
52+
declare let unknown: {
53+
properties: {
54+
wrong: string
55+
}
56+
}
57+
let weak: Weak & Spoiler = unknown
4458

4559

4660
//// [weakType.js]
@@ -64,3 +78,4 @@ var K = (function () {
6478
return K;
6579
}());
6680
var ctor = K;
81+
var weak = unknown;

tests/cases/compiler/weakType.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,17 @@ interface Ctor {
4040
n?: number
4141
}
4242
let ctor: Ctor = K
43+
44+
type Spoiler = { nope?: string }
45+
type Weak = {
46+
a?: number
47+
properties?: {
48+
b?: number
49+
}
50+
}
51+
declare let unknown: {
52+
properties: {
53+
wrong: string
54+
}
55+
}
56+
let weak: Weak & Spoiler = unknown

0 commit comments

Comments
 (0)