mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 08:11:30 -06:00
Fix crash caused by assertion with evolving array type (#38398)
* Properly finalize evolving array type in getTypeAtFlowCall * Add regression test
This commit is contained in:
parent
f08863d2fc
commit
7798f532df
@ -20360,7 +20360,7 @@ namespace ts {
|
||||
const predicate = getTypePredicateOfSignature(signature);
|
||||
if (predicate && (predicate.kind === TypePredicateKind.AssertsThis || predicate.kind === TypePredicateKind.AssertsIdentifier)) {
|
||||
const flowType = getTypeAtFlowNode(flow.antecedent);
|
||||
const type = getTypeFromFlowType(flowType);
|
||||
const type = finalizeEvolvingArrayType(getTypeFromFlowType(flowType));
|
||||
const narrowedType = predicate.type ? narrowTypeByTypePredicate(type, predicate, flow.node, /*assumeTrue*/ true) :
|
||||
predicate.kind === TypePredicateKind.AssertsIdentifier && predicate.parameterIndex >= 0 && predicate.parameterIndex < flow.node.arguments.length ? narrowTypeByAssertion(type, flow.node.arguments[predicate.parameterIndex]) :
|
||||
type;
|
||||
|
||||
23
tests/baselines/reference/evolvingArrayTypeInAssert.js
Normal file
23
tests/baselines/reference/evolvingArrayTypeInAssert.js
Normal file
@ -0,0 +1,23 @@
|
||||
//// [evolvingArrayTypeInAssert.ts]
|
||||
export function unsafeCast<T>(_value: unknown): asserts _value is T { }
|
||||
|
||||
function yadda() {
|
||||
let out = [];
|
||||
out.push(100)
|
||||
unsafeCast<any>(out);
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
//// [evolvingArrayTypeInAssert.js]
|
||||
"use strict";
|
||||
exports.__esModule = true;
|
||||
exports.unsafeCast = void 0;
|
||||
function unsafeCast(_value) { }
|
||||
exports.unsafeCast = unsafeCast;
|
||||
function yadda() {
|
||||
var out = [];
|
||||
out.push(100);
|
||||
unsafeCast(out);
|
||||
return out;
|
||||
}
|
||||
27
tests/baselines/reference/evolvingArrayTypeInAssert.symbols
Normal file
27
tests/baselines/reference/evolvingArrayTypeInAssert.symbols
Normal file
@ -0,0 +1,27 @@
|
||||
=== tests/cases/compiler/evolvingArrayTypeInAssert.ts ===
|
||||
export function unsafeCast<T>(_value: unknown): asserts _value is T { }
|
||||
>unsafeCast : Symbol(unsafeCast, Decl(evolvingArrayTypeInAssert.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(evolvingArrayTypeInAssert.ts, 0, 27))
|
||||
>_value : Symbol(_value, Decl(evolvingArrayTypeInAssert.ts, 0, 30))
|
||||
>_value : Symbol(_value, Decl(evolvingArrayTypeInAssert.ts, 0, 30))
|
||||
>T : Symbol(T, Decl(evolvingArrayTypeInAssert.ts, 0, 27))
|
||||
|
||||
function yadda() {
|
||||
>yadda : Symbol(yadda, Decl(evolvingArrayTypeInAssert.ts, 0, 71))
|
||||
|
||||
let out = [];
|
||||
>out : Symbol(out, Decl(evolvingArrayTypeInAssert.ts, 3, 7))
|
||||
|
||||
out.push(100)
|
||||
>out.push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
|
||||
>out : Symbol(out, Decl(evolvingArrayTypeInAssert.ts, 3, 7))
|
||||
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
|
||||
|
||||
unsafeCast<any>(out);
|
||||
>unsafeCast : Symbol(unsafeCast, Decl(evolvingArrayTypeInAssert.ts, 0, 0))
|
||||
>out : Symbol(out, Decl(evolvingArrayTypeInAssert.ts, 3, 7))
|
||||
|
||||
return out;
|
||||
>out : Symbol(out, Decl(evolvingArrayTypeInAssert.ts, 3, 7))
|
||||
}
|
||||
|
||||
28
tests/baselines/reference/evolvingArrayTypeInAssert.types
Normal file
28
tests/baselines/reference/evolvingArrayTypeInAssert.types
Normal file
@ -0,0 +1,28 @@
|
||||
=== tests/cases/compiler/evolvingArrayTypeInAssert.ts ===
|
||||
export function unsafeCast<T>(_value: unknown): asserts _value is T { }
|
||||
>unsafeCast : <T>(_value: unknown) => asserts _value is T
|
||||
>_value : unknown
|
||||
|
||||
function yadda() {
|
||||
>yadda : () => number[]
|
||||
|
||||
let out = [];
|
||||
>out : any[]
|
||||
>[] : never[]
|
||||
|
||||
out.push(100)
|
||||
>out.push(100) : number
|
||||
>out.push : (...items: any[]) => number
|
||||
>out : any[]
|
||||
>push : (...items: any[]) => number
|
||||
>100 : 100
|
||||
|
||||
unsafeCast<any>(out);
|
||||
>unsafeCast<any>(out) : void
|
||||
>unsafeCast : <T>(_value: unknown) => asserts _value is T
|
||||
>out : number[]
|
||||
|
||||
return out;
|
||||
>out : number[]
|
||||
}
|
||||
|
||||
10
tests/cases/compiler/evolvingArrayTypeInAssert.ts
Normal file
10
tests/cases/compiler/evolvingArrayTypeInAssert.ts
Normal file
@ -0,0 +1,10 @@
|
||||
// @strict: true
|
||||
|
||||
export function unsafeCast<T>(_value: unknown): asserts _value is T { }
|
||||
|
||||
function yadda() {
|
||||
let out = [];
|
||||
out.push(100)
|
||||
unsafeCast<any>(out);
|
||||
return out;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user