-
Notifications
You must be signed in to change notification settings - Fork 12.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a failing test case when the discriminant is a property of a para…
…meter
- Loading branch information
Showing
5 changed files
with
372 additions
and
0 deletions.
There are no files selected for viewing
245 changes: 245 additions & 0 deletions
245
tests/baselines/reference/dependentDestructuredVariables.errors.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,245 @@ | ||
tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts(236,17): error TS2531: Object is possibly 'null'. | ||
|
||
|
||
==== tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts (1 errors) ==== | ||
type Action = | ||
| { kind: 'A', payload: number } | ||
| { kind: 'B', payload: string }; | ||
|
||
function f10({ kind, payload }: Action) { | ||
if (kind === 'A') { | ||
payload.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
payload.toUpperCase(); | ||
} | ||
} | ||
|
||
function f11(action: Action) { | ||
const { kind, payload } = action; | ||
if (kind === 'A') { | ||
payload.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
payload.toUpperCase(); | ||
} | ||
} | ||
|
||
function f12({ kind, payload }: Action) { | ||
switch (kind) { | ||
case 'A': | ||
payload.toFixed(); | ||
break; | ||
case 'B': | ||
payload.toUpperCase(); | ||
break; | ||
default: | ||
payload; // never | ||
} | ||
} | ||
|
||
type Action2 = | ||
| { kind: 'A', payload: number | undefined } | ||
| { kind: 'B', payload: string | undefined }; | ||
|
||
function f20({ kind, payload }: Action2) { | ||
if (payload) { | ||
if (kind === 'A') { | ||
payload.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
payload.toUpperCase(); | ||
} | ||
} | ||
} | ||
|
||
function f21(action: Action2) { | ||
const { kind, payload } = action; | ||
if (payload) { | ||
if (kind === 'A') { | ||
payload.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
payload.toUpperCase(); | ||
} | ||
} | ||
} | ||
|
||
function f22(action: Action2) { | ||
if (action.payload) { | ||
const { kind, payload } = action; | ||
if (kind === 'A') { | ||
payload.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
payload.toUpperCase(); | ||
} | ||
} | ||
} | ||
|
||
function f23({ kind, payload }: Action2) { | ||
if (payload) { | ||
switch (kind) { | ||
case 'A': | ||
payload.toFixed(); | ||
break; | ||
case 'B': | ||
payload.toUpperCase(); | ||
break; | ||
default: | ||
payload; // never | ||
} | ||
} | ||
} | ||
|
||
type Foo = | ||
| { kind: 'A', isA: true } | ||
| { kind: 'B', isA: false } | ||
| { kind: 'C', isA: false }; | ||
|
||
function f30({ kind, isA }: Foo) { | ||
if (kind === 'A') { | ||
isA; // true | ||
} | ||
if (kind === 'B') { | ||
isA; // false | ||
} | ||
if (kind === 'C') { | ||
isA; // false | ||
} | ||
if (isA) { | ||
kind; // 'A' | ||
} | ||
else { | ||
kind; // 'B' | 'C' | ||
} | ||
} | ||
|
||
type Args = ['A', number] | ['B', string] | ||
|
||
function f40(...[kind, data]: Args) { | ||
if (kind === 'A') { | ||
data.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
data.toUpperCase(); | ||
} | ||
} | ||
|
||
// Repro from #35283 | ||
|
||
interface A<T> { variant: 'a', value: T } | ||
|
||
interface B<T> { variant: 'b', value: Array<T> } | ||
|
||
type AB<T> = A<T> | B<T>; | ||
|
||
declare function printValue<T>(t: T): void; | ||
|
||
declare function printValueList<T>(t: Array<T>): void; | ||
|
||
function unrefined1<T>(ab: AB<T>): void { | ||
const { variant, value } = ab; | ||
if (variant === 'a') { | ||
printValue<T>(value); | ||
} | ||
else { | ||
printValueList<T>(value); | ||
} | ||
} | ||
|
||
// Repro from #38020 | ||
|
||
type Action3 = | ||
| {type: 'add', payload: { toAdd: number } } | ||
| {type: 'remove', payload: { toRemove: number } }; | ||
|
||
const reducerBroken = (state: number, { type, payload }: Action3) => { | ||
switch (type) { | ||
case 'add': | ||
return state + payload.toAdd; | ||
case 'remove': | ||
return state - payload.toRemove; | ||
} | ||
} | ||
|
||
// Repro from #46143 | ||
|
||
declare var it: Iterator<number>; | ||
const { value, done } = it.next(); | ||
if (!done) { | ||
value; // number | ||
} | ||
|
||
// Repro from #46658 | ||
|
||
declare function f50(cb: (...args: Args) => void): void | ||
|
||
f50((kind, data) => { | ||
if (kind === 'A') { | ||
data.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
data.toUpperCase(); | ||
} | ||
}); | ||
|
||
const f51: (...args: ['A', number] | ['B', string]) => void = (kind, payload) => { | ||
if (kind === 'A') { | ||
payload.toFixed(); | ||
} | ||
if (kind === 'B') { | ||
payload.toUpperCase(); | ||
} | ||
}; | ||
|
||
const f52: (...args: ['A', number] | ['B']) => void = (kind, payload?) => { | ||
if (kind === 'A') { | ||
payload.toFixed(); | ||
} | ||
else { | ||
payload; // undefined | ||
} | ||
}; | ||
|
||
declare function readFile(path: string, callback: (...args: [err: null, data: unknown[]] | [err: Error, data: undefined]) => void): void; | ||
|
||
readFile('hello', (err, data) => { | ||
if (err === null) { | ||
data.length; | ||
} | ||
else { | ||
err.message; | ||
} | ||
}); | ||
|
||
type ReducerArgs = ["add", { a: number, b: number }] | ["concat", { firstArr: any[], secondArr: any[] }]; | ||
|
||
const reducer: (...args: ReducerArgs) => void = (op, args) => { | ||
switch (op) { | ||
case "add": | ||
console.log(args.a + args.b); | ||
break; | ||
case "concat": | ||
console.log(args.firstArr.concat(args.secondArr)); | ||
break; | ||
} | ||
} | ||
|
||
reducer("add", { a: 1, b: 3 }); | ||
reducer("concat", { firstArr: [1, 2], secondArr: [3, 4] }); | ||
|
||
type XStateActionArgs = | ||
| [event: { type: "LOG_OUT" }, context: { user: { name: string } }] | ||
| [event: { type: "LOG_IN" }, context: { user: null }]; | ||
const xstateAction: (...args: XStateActionArgs) => void = ( | ||
event, | ||
context | ||
) => { | ||
if (event.type === 'LOG_OUT') { | ||
console.log(context.user.name) | ||
~~~~~~~~~~~~ | ||
!!! error TS2531: Object is possibly 'null'. | ||
} | ||
}; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.