diff --git a/tests/baselines/reference/nonNullableReduction.types b/tests/baselines/reference/nonNullableReduction.types index 5c0863fc379d2..20a4a82179f7f 100644 --- a/tests/baselines/reference/nonNullableReduction.types +++ b/tests/baselines/reference/nonNullableReduction.types @@ -17,7 +17,7 @@ function test(f1: Transform1, f2: Transform2) { f1?.("hello"); >f1?.("hello") : T | undefined ->f1 : Transform1 +>f1 : ((value: string) => T) | undefined >"hello" : "hello" f2?.("hello"); diff --git a/tests/baselines/reference/nonNullableReductionNonStrict.js b/tests/baselines/reference/nonNullableReductionNonStrict.js new file mode 100644 index 0000000000000..29c88cdec7fc1 --- /dev/null +++ b/tests/baselines/reference/nonNullableReductionNonStrict.js @@ -0,0 +1,32 @@ +//// [nonNullableReductionNonStrict.ts] +// Repros from #43425 + +type Transform1 = ((value: string) => T) | (string extends T ? undefined : never); +type Transform2 = string extends T ? ((value: string) => T) | undefined : (value: string) => T; + +function test(f1: Transform1, f2: Transform2) { + f1?.("hello"); + f2?.("hello"); +} + +function f1(x: T | (string extends T ? null | undefined : never)) { + let z = x!; // NonNullable +} + +function f2(x: T | U) { + let z = x!; // NonNullable +} + + +//// [nonNullableReductionNonStrict.js] +// Repros from #43425 +function test(f1, f2) { + f1 === null || f1 === void 0 ? void 0 : f1("hello"); + f2 === null || f2 === void 0 ? void 0 : f2("hello"); +} +function f1(x) { + var z = x; // NonNullable +} +function f2(x) { + var z = x; // NonNullable +} diff --git a/tests/baselines/reference/nonNullableReductionNonStrict.symbols b/tests/baselines/reference/nonNullableReductionNonStrict.symbols new file mode 100644 index 0000000000000..20e0c8ee0ff80 --- /dev/null +++ b/tests/baselines/reference/nonNullableReductionNonStrict.symbols @@ -0,0 +1,61 @@ +=== tests/cases/compiler/nonNullableReductionNonStrict.ts === +// Repros from #43425 + +type Transform1 = ((value: string) => T) | (string extends T ? undefined : never); +>Transform1 : Symbol(Transform1, Decl(nonNullableReductionNonStrict.ts, 0, 0)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 2, 16)) +>value : Symbol(value, Decl(nonNullableReductionNonStrict.ts, 2, 23)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 2, 16)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 2, 16)) + +type Transform2 = string extends T ? ((value: string) => T) | undefined : (value: string) => T; +>Transform2 : Symbol(Transform2, Decl(nonNullableReductionNonStrict.ts, 2, 85)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 3, 16)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 3, 16)) +>value : Symbol(value, Decl(nonNullableReductionNonStrict.ts, 3, 42)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 3, 16)) +>value : Symbol(value, Decl(nonNullableReductionNonStrict.ts, 3, 78)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 3, 16)) + +function test(f1: Transform1, f2: Transform2) { +>test : Symbol(test, Decl(nonNullableReductionNonStrict.ts, 3, 98)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 5, 14)) +>f1 : Symbol(f1, Decl(nonNullableReductionNonStrict.ts, 5, 17)) +>Transform1 : Symbol(Transform1, Decl(nonNullableReductionNonStrict.ts, 0, 0)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 5, 14)) +>f2 : Symbol(f2, Decl(nonNullableReductionNonStrict.ts, 5, 35)) +>Transform2 : Symbol(Transform2, Decl(nonNullableReductionNonStrict.ts, 2, 85)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 5, 14)) + + f1?.("hello"); +>f1 : Symbol(f1, Decl(nonNullableReductionNonStrict.ts, 5, 17)) + + f2?.("hello"); +>f2 : Symbol(f2, Decl(nonNullableReductionNonStrict.ts, 5, 35)) +} + +function f1(x: T | (string extends T ? null | undefined : never)) { +>f1 : Symbol(f1, Decl(nonNullableReductionNonStrict.ts, 8, 1)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 10, 12)) +>x : Symbol(x, Decl(nonNullableReductionNonStrict.ts, 10, 15)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 10, 12)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 10, 12)) + + let z = x!; // NonNullable +>z : Symbol(z, Decl(nonNullableReductionNonStrict.ts, 11, 7)) +>x : Symbol(x, Decl(nonNullableReductionNonStrict.ts, 10, 15)) +} + +function f2(x: T | U) { +>f2 : Symbol(f2, Decl(nonNullableReductionNonStrict.ts, 12, 1)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 14, 12)) +>U : Symbol(U, Decl(nonNullableReductionNonStrict.ts, 14, 14)) +>x : Symbol(x, Decl(nonNullableReductionNonStrict.ts, 14, 43)) +>T : Symbol(T, Decl(nonNullableReductionNonStrict.ts, 14, 12)) +>U : Symbol(U, Decl(nonNullableReductionNonStrict.ts, 14, 14)) + + let z = x!; // NonNullable +>z : Symbol(z, Decl(nonNullableReductionNonStrict.ts, 15, 7)) +>x : Symbol(x, Decl(nonNullableReductionNonStrict.ts, 14, 43)) +} + diff --git a/tests/baselines/reference/nonNullableReductionNonStrict.types b/tests/baselines/reference/nonNullableReductionNonStrict.types new file mode 100644 index 0000000000000..075ee5a41fd1b --- /dev/null +++ b/tests/baselines/reference/nonNullableReductionNonStrict.types @@ -0,0 +1,50 @@ +=== tests/cases/compiler/nonNullableReductionNonStrict.ts === +// Repros from #43425 + +type Transform1 = ((value: string) => T) | (string extends T ? undefined : never); +>Transform1 : Transform1 +>value : string + +type Transform2 = string extends T ? ((value: string) => T) | undefined : (value: string) => T; +>Transform2 : Transform2 +>value : string +>value : string + +function test(f1: Transform1, f2: Transform2) { +>test : (f1: Transform1, f2: Transform2) => void +>f1 : Transform1 +>f2 : Transform2 + + f1?.("hello"); +>f1?.("hello") : T +>f1 : (value: string) => T +>"hello" : "hello" + + f2?.("hello"); +>f2?.("hello") : T +>f2 : ((value: string) => T) | ((value: string) => T) +>"hello" : "hello" +} + +function f1(x: T | (string extends T ? null | undefined : never)) { +>f1 : (x: T | (string extends T ? null | undefined : never)) => void +>x : T | (string extends T ? null : never) +>null : null + + let z = x!; // NonNullable +>z : T | (string extends T ? null : never) +>x! : T | (string extends T ? null : never) +>x : T | (string extends T ? null : never) +} + +function f2(x: T | U) { +>f2 : (x: T | U) => void +>null : null +>x : T | U + + let z = x!; // NonNullable +>z : T | U +>x! : T | U +>x : T | U +} + diff --git a/tests/cases/compiler/nonNullableReductionNonStrict.ts b/tests/cases/compiler/nonNullableReductionNonStrict.ts new file mode 100644 index 0000000000000..6212431709dad --- /dev/null +++ b/tests/cases/compiler/nonNullableReductionNonStrict.ts @@ -0,0 +1,17 @@ +// Repros from #43425 + +type Transform1 = ((value: string) => T) | (string extends T ? undefined : never); +type Transform2 = string extends T ? ((value: string) => T) | undefined : (value: string) => T; + +function test(f1: Transform1, f2: Transform2) { + f1?.("hello"); + f2?.("hello"); +} + +function f1(x: T | (string extends T ? null | undefined : never)) { + let z = x!; // NonNullable +} + +function f2(x: T | U) { + let z = x!; // NonNullable +}