diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7bc999936e81c..44af699008878 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -20280,7 +20280,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; diff --git a/tests/baselines/reference/evolvingArrayTypeInAssert.js b/tests/baselines/reference/evolvingArrayTypeInAssert.js new file mode 100644 index 0000000000000..498bfc283cca6 --- /dev/null +++ b/tests/baselines/reference/evolvingArrayTypeInAssert.js @@ -0,0 +1,23 @@ +//// [evolvingArrayTypeInAssert.ts] +export function unsafeCast(_value: unknown): asserts _value is T { } + +function yadda() { + let out = []; + out.push(100) + unsafeCast(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; +} diff --git a/tests/baselines/reference/evolvingArrayTypeInAssert.symbols b/tests/baselines/reference/evolvingArrayTypeInAssert.symbols new file mode 100644 index 0000000000000..19e8c741f0cbd --- /dev/null +++ b/tests/baselines/reference/evolvingArrayTypeInAssert.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/evolvingArrayTypeInAssert.ts === +export function unsafeCast(_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(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)) +} + diff --git a/tests/baselines/reference/evolvingArrayTypeInAssert.types b/tests/baselines/reference/evolvingArrayTypeInAssert.types new file mode 100644 index 0000000000000..bcd9e5cfdd0cc --- /dev/null +++ b/tests/baselines/reference/evolvingArrayTypeInAssert.types @@ -0,0 +1,28 @@ +=== tests/cases/compiler/evolvingArrayTypeInAssert.ts === +export function unsafeCast(_value: unknown): asserts _value is T { } +>unsafeCast : (_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(out); +>unsafeCast(out) : void +>unsafeCast : (_value: unknown) => asserts _value is T +>out : number[] + + return out; +>out : number[] +} + diff --git a/tests/cases/compiler/evolvingArrayTypeInAssert.ts b/tests/cases/compiler/evolvingArrayTypeInAssert.ts new file mode 100644 index 0000000000000..b56ba244808b3 --- /dev/null +++ b/tests/cases/compiler/evolvingArrayTypeInAssert.ts @@ -0,0 +1,10 @@ +// @strict: true + +export function unsafeCast(_value: unknown): asserts _value is T { } + +function yadda() { + let out = []; + out.push(100) + unsafeCast(out); + return out; +}