Bug Report
π Search Terms
Generic type narrowing
π Version & Regression Information
- This changed between versions 4.8.4 and 4.9.5
β― Playground Link
https://www.typescriptlang.org/play?ts=5.0.4#code/GYVwdgxgLglg9mABFApgZygHgCqJQD1TABM1EBDMATwG0BdRAH0QCUUI4AnYzDTmMAHMANBWoA+cQAo4AIwBWALkTYAlIgDeAWABQifYhjBEUgIKdO5KgDoYac5aoyF6xswDkAGxRCoAC3dDJDl5dW09A30QgG5dfQB6eMQAPQB+OIMAXzxPNBRNDMiYjMSU9Ij9TN0qnV1QSFgEZHQoACYcPEIfUjFaBmY2Dm5eKH4hUUoqSWclFTDCw2MzCytbexWnENV5ioNiiNK0heyUXPzwyKiFWIOko92amqA
π» Code
function test<T extends any[] | Record<string, any>>(obj: T) {
if (Array.isArray(obj) || 'length' in obj) {
obj;
// ^? (parameter) obj: T extends any[] | Record<string, any>
} else {
obj;
// ^? (parameter) obj: never
}
}
function test2<T extends any[] | Record<string, any>>(obj: T) {
if (Array.isArray(obj)) {
obj;
// ^? (parameter) obj: T & any[]
} else {
obj;
// ^? (parameter) obj: T extends any[] | Record<string, any>
}
}
π Actual behavior
In the else branch of the test function, obj is inferred as never type.
π Expected behavior
In the else branch of the test function, obj should be inferred as T extends any[] | Record<string, any> type.
Bug Report
π Search Terms
Generic type narrowing
π Version & Regression Information
β― Playground Link
https://www.typescriptlang.org/play?ts=5.0.4#code/GYVwdgxgLglg9mABFApgZygHgCqJQD1TABM1EBDMATwG0BdRAH0QCUUI4AnYzDTmMAHMANBWoA+cQAo4AIwBWALkTYAlIgDeAWABQifYhjBEUgIKdO5KgDoYac5aoyF6xswDkAGxRCoAC3dDJDl5dW09A30QgG5dfQB6eMQAPQB+OIMAXzxPNBRNDMiYjMSU9Ij9TN0qnV1QSFgEZHQoACYcPEIfUjFaBmY2Dm5eKH4hUUoqSWclFTDCw2MzCytbexWnENV5ioNiiNK0heyUXPzwyKiFWIOko92amqA
π» Code
π Actual behavior
In the else branch of the
testfunction, obj is inferred asnevertype.π Expected behavior
In the else branch of the
testfunction, obj should be inferred asT extends any[] | Record<string, any>type.