Open
Description
🔎 Search Terms
strictNullChecks false assign never
🕗 Version & Regression Information
- typescript 3.6.0-dev.20190612, 3.6.0, and every version on TS Playground between 3.6.1 and nightly (5.7.0-dev.20240914)
- This changed between versions 3.6.0-dev.20190611 and 3.6.0-dev.20190612
- This changed in commit or PR 74c6bc1 (Filter primitives from union when checking for mismatched excess props if nonprimitive type is present #31708)
- No error in da2aa97
⏯ Playground Link
💻 Code
type Obj = {
prop1?: string;
prop2?: string;
prop3?: number;
prop4?: Date;
};
// Case 1: All properties have the same type (string)
const f1 = (obj: Obj, key: "prop1" | "prop2") => {
obj[key] = undefined; // Valid
obj[key] = null; // Valid when strictNullChecks is false
};
// Case 2: Properties have different primitive types (string | number)
const f2 = (obj: Obj, key: "prop1" | "prop3") => {
obj[key] = undefined; // Error when strictNullChecks is false. Expected to be valid
obj[key] = null; // Error. Expected to be valid when strictNullChecks is false
const val = obj[key]; // Valid (type is string | number)
// Workaround
const obj2 = obj as {prop1?: undefined, prop3?: undefined};
obj2[key] = undefined; // Valid
obj2[key] = null; // Valid when strictNullChecks is false
// Valid even with `exactOptionalPropertyTypes: true`, though behavior differs
delete obj[key];
};
// Case 3: Properties include both primitive and object types (string | Date)
const f3 = (obj: Obj, key: "prop1" | "prop4") => {
obj[key] = undefined; // Valid
obj[key] = null; // Valid when strictNullChecks is false
};
🙁 Actual behavior
-
In Case 2, when
strictNullChecks
is false:- Assigning
undefined
results in an error: "Type 'undefined' is not assignable to type 'never'.(TS2322)" - Assigning
null
always results in an error: "Type 'null' is not assignable to type 'never'.(TS2322)"
- Assigning
-
The behavior is inconsistent across different combinations of property types.
🙂 Expected behavior
Since all properties in Obj
are optional, it should be possible to assign undefined
to obj[key]
regardless of the strictNullChecks
setting, unless exactOptionalPropertyTypes
is true (which cannot be used with strictNullChecks: false
).
Additionally, when strictNullChecks
is false, assigning null
should be allowed for all cases.
Additional information about the issue
No response