TypeScript/tests/baselines/reference/controlFlowOptionalChain2.js
Andrew Branch c15f40abfa
Fix discriminant property narrowing through optional chain with null (#42503)
* Fix discriminant property narrowing through optional chain with null

* Accept baselines

* Add tests from Anders
2021-01-29 12:03:42 -08:00

189 lines
3.2 KiB
TypeScript

//// [controlFlowOptionalChain2.ts]
type A = {
type: 'A';
name: string;
}
type B = {
type: 'B';
}
function funcTwo(arg: A | B | undefined) {
if (arg?.type === 'B') {
arg; // `B`
return;
}
arg;
arg?.name;
}
function funcThree(arg: A | B | null) {
if (arg?.type === 'B') {
arg; // `B`
return;
}
arg;
arg?.name;
}
type U = { kind: undefined, u: 'u' }
type N = { kind: null, n: 'n' }
type X = { kind: 'X', x: 'x' }
function f1(x: X | U | undefined) {
if (x?.kind === undefined) {
x; // U | undefined
}
else {
x; // X
}
}
function f2(x: X | N | undefined) {
if (x?.kind === undefined) {
x; // undefined
}
else {
x; // X | N
}
}
function f3(x: X | U | null) {
if (x?.kind === undefined) {
x; // U | null
}
else {
x; // X
}
}
function f4(x: X | N | null) {
if (x?.kind === undefined) {
x; // null
}
else {
x; // X | N
}
}
function f5(x: X | U | undefined) {
if (x?.kind === null) {
x; // never
}
else {
x; // X | U | undefined
}
}
function f6(x: X | N | undefined) {
if (x?.kind === null) {
x; // N
}
else {
x; // X | undefined
}
}
function f7(x: X | U | null) {
if (x?.kind === null) {
x; // never
}
else {
x; // X | U | null
}
}
function f8(x: X | N | null) {
if (x?.kind === null) {
x; // N
}
else {
x; // X | null
}
}
//// [controlFlowOptionalChain2.js]
function funcTwo(arg) {
if ((arg === null || arg === void 0 ? void 0 : arg.type) === 'B') {
arg; // `B`
return;
}
arg;
arg === null || arg === void 0 ? void 0 : arg.name;
}
function funcThree(arg) {
if ((arg === null || arg === void 0 ? void 0 : arg.type) === 'B') {
arg; // `B`
return;
}
arg;
arg === null || arg === void 0 ? void 0 : arg.name;
}
function f1(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === undefined) {
x; // U | undefined
}
else {
x; // X
}
}
function f2(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === undefined) {
x; // undefined
}
else {
x; // X | N
}
}
function f3(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === undefined) {
x; // U | null
}
else {
x; // X
}
}
function f4(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === undefined) {
x; // null
}
else {
x; // X | N
}
}
function f5(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === null) {
x; // never
}
else {
x; // X | U | undefined
}
}
function f6(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === null) {
x; // N
}
else {
x; // X | undefined
}
}
function f7(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === null) {
x; // never
}
else {
x; // X | U | null
}
}
function f8(x) {
if ((x === null || x === void 0 ? void 0 : x.kind) === null) {
x; // N
}
else {
x; // X | null
}
}