Skip to content

Commit b3f3df5

Browse files
committed
fix bug
1 parent 2514a64 commit b3f3df5

File tree

5 files changed

+102
-1
lines changed

5 files changed

+102
-1
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26740,7 +26740,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2674026740
function hasMatchingArgument(expression: CallExpression | NewExpression, reference: Node) {
2674126741
if (expression.arguments) {
2674226742
for (const argument of expression.arguments) {
26743-
if (isOrContainsMatchingReference(reference, argument) || optionalChainContainsReference(argument, reference)) {
26743+
if (isOrContainsMatchingReference(reference, argument)
26744+
|| optionalChainContainsReference(argument, reference)
26745+
|| isAccessExpression(argument) && isMatchingReference(reference, argument.expression)) {
2674426746
return true;
2674526747
}
2674626748
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [tests/cases/compiler/typePredicatesCanNarrowByDiscriminant.ts] ////
2+
3+
//// [typePredicatesCanNarrowByDiscriminant.ts]
4+
// #45770
5+
declare const fruit: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
6+
7+
declare function isOneOf<T, U extends T>(item: T, array: readonly U[]): item is U
8+
if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
9+
fruit.kind
10+
fruit
11+
}
12+
13+
//// [typePredicatesCanNarrowByDiscriminant.js]
14+
"use strict";
15+
if (isOneOf(fruit.kind, ['apple', 'banana'])) {
16+
fruit.kind;
17+
fruit;
18+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// [tests/cases/compiler/typePredicatesCanNarrowByDiscriminant.ts] ////
2+
3+
=== typePredicatesCanNarrowByDiscriminant.ts ===
4+
// #45770
5+
declare const fruit: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
6+
>fruit : Symbol(fruit, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 13))
7+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 22))
8+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 41))
9+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 62))
10+
11+
declare function isOneOf<T, U extends T>(item: T, array: readonly U[]): item is U
12+
>isOneOf : Symbol(isOneOf, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 79))
13+
>T : Symbol(T, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 25))
14+
>U : Symbol(U, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 27))
15+
>T : Symbol(T, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 25))
16+
>item : Symbol(item, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 41))
17+
>T : Symbol(T, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 25))
18+
>array : Symbol(array, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 49))
19+
>U : Symbol(U, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 27))
20+
>item : Symbol(item, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 41))
21+
>U : Symbol(U, Decl(typePredicatesCanNarrowByDiscriminant.ts, 3, 27))
22+
23+
if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
24+
>isOneOf : Symbol(isOneOf, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 79))
25+
>fruit.kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 22), Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 41), Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 62))
26+
>fruit : Symbol(fruit, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 13))
27+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 22), Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 41), Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 62))
28+
>const : Symbol(const)
29+
30+
fruit.kind
31+
>fruit.kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 22), Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 41))
32+
>fruit : Symbol(fruit, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 13))
33+
>kind : Symbol(kind, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 22), Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 41))
34+
35+
fruit
36+
>fruit : Symbol(fruit, Decl(typePredicatesCanNarrowByDiscriminant.ts, 1, 13))
37+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//// [tests/cases/compiler/typePredicatesCanNarrowByDiscriminant.ts] ////
2+
3+
=== typePredicatesCanNarrowByDiscriminant.ts ===
4+
// #45770
5+
declare const fruit: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
6+
>fruit : { kind: 'apple'; } | { kind: 'banana'; } | { kind: 'cherry'; }
7+
>kind : "apple"
8+
>kind : "banana"
9+
>kind : "cherry"
10+
11+
declare function isOneOf<T, U extends T>(item: T, array: readonly U[]): item is U
12+
>isOneOf : <T, U extends T>(item: T, array: readonly U[]) => item is U
13+
>item : T
14+
>array : readonly U[]
15+
16+
if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
17+
>isOneOf(fruit.kind, ['apple', 'banana'] as const) : boolean
18+
>isOneOf : <T, U extends T>(item: T, array: readonly U[]) => item is U
19+
>fruit.kind : "apple" | "banana" | "cherry"
20+
>fruit : { kind: "apple"; } | { kind: "banana"; } | { kind: "cherry"; }
21+
>kind : "apple" | "banana" | "cherry"
22+
>['apple', 'banana'] as const : readonly ["apple", "banana"]
23+
>['apple', 'banana'] : readonly ["apple", "banana"]
24+
>'apple' : "apple"
25+
>'banana' : "banana"
26+
27+
fruit.kind
28+
>fruit.kind : "apple" | "banana"
29+
>fruit : { kind: "apple"; } | { kind: "banana"; }
30+
>kind : "apple" | "banana"
31+
32+
fruit
33+
>fruit : { kind: "apple"; } | { kind: "banana"; }
34+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// @strict: true
2+
3+
// #45770
4+
declare const fruit: { kind: 'apple'} | { kind: 'banana' } | { kind: 'cherry' }
5+
6+
declare function isOneOf<T, U extends T>(item: T, array: readonly U[]): item is U
7+
if (isOneOf(fruit.kind, ['apple', 'banana'] as const)) {
8+
fruit.kind
9+
fruit
10+
}

0 commit comments

Comments
 (0)