Open Noriller opened 2 months ago
This is independent of filter()
:
function positive(t: Something) {
return isAnimal(t)
}
// function positive(t: Something): t is Animal
function negative(t: Something) {
return !isAnimal(t)
}
// function negative(t: Something): boolean
I'm surprised that #57465 didn't do this. Inside negative()
it certainly seems that !isAnimal(t)
narrows in the way we expect:
function negative(t: Something) {
if (!isAnimal(t)) {
((t));
//^? (parameter) t: Rock
} else {
((t));
//^? ^?(parameter) t: Animal
}
return !isAnimal(t)
}
@jcalz I don't think there's anything #57465 could have done to help here. We don't have negated types so you can't say t is not Animal
--not even explicitly.
But we don't need t is not Animal
, only t is Rock
.
Actually, it should be Exclude<Something, Animal>
because in the case we add another one, we want all except the one we are filtering out.
I certainly didn't mean that t => !isAnimal(t)
should return t is Rock
no matter what Something
is, that would be bonkers. Yes, I'd expect Exclude<Something, Animal>
, which in your example code was Rock
.
π Search Terms
filter is type narrow negative
π Version & Regression Information
β― Playground Link
https://www.typescriptlang.org/play/?ts=5.5.2#code/C4TwDgpgBAggdgSwLYEMA2UC8UDeAoKKAIwCcIVgALALimBIFcIAaPAXwG489RIoAlAPYBjANZZcBYmQo0oAM3QBnFuy49w0AMqCkEKgjgBzCfGTooAHwEjR6+QzjDgCQXCgIlZ1GgAUS3X1KQyNaHT0DYwBKWgCI4OMPJVhEH0lCMmAGEnc4oJCAOlJyKnZuYTclYDoIKoBGMMDIk2x8QmLZWnomVjZyyurgWuAAJkb4kIk26RK5RTQVXvUKuCq6YKUASSUAeXFsAG0h+uYaqpGAXQL5BDQhkl9qzAA+JO90R6iorgB6H8IAYQAHoAfhS5jQBwu-VWgw22wA6iQ3C0oEdhnVTsdRlcbncIA8nq8AISed5+YBfX7-QHAsG+clWGxiKJQvBAA
π» Code
π Actual behavior
π Expected behavior
Additional information about the issue
Filtering is working only if "positive", but if the "is" is used as a negative then it don't type narrow.