Open JacobLey opened 2 years ago
I agree that this should work:
const mixedData: (string | null)[] = ['abc', '', null, 'xyz'];
// Eslint is unhappy, but `null` is removed from type
const typedMixedData: string[] = mixedData.filter((d): d is string => Boolean(d));
Similarly I could provide some method like
isTruthy
Note that this example however is wrong, isTruthy(true)
asserts that true
is string | number | symbol | object | unknown[]
, which it isn't
related: there's a request in TypeScript to use boolean as a type guard: https://github.com/microsoft/TypeScript/issues/16069
Would be nice to have this ignore ones with type guards if possible indeed because the rule seems useful. There seems to be a new PR to fix this on TS but it's been years and years so could be good to fix this for older TS versions.
For those curious, the underlying TypeScript feature to assert types from boolean coercion functions has been implemented and will be released in TypeScript 5.5: https://github.com/microsoft/TypeScript/pull/57465#issuecomment-2016987675
Closing as mixedData.filter(Boolean)
works in:
prefer-native-coercion-functions
no-array-callback-reference
@fregante what do you mean https://github.com/microsoft/TypeScript/pull/57465#issuecomment-2184170318 .filter(Boolean)
doesn't work it has to be .filter((uuid) => uuid !== undefined)
or .filter((uuid) => uuid !== null)
to have narrowing working. I'm hoping they get it working later because that's a pretty common use-case indeed. We have TS 5.5.4.
Yeah, that's my bad. This is the issue to track: microsoft/TypeScript#16655
prefer-native-coercion-functions
is used to simplify methods likefilter
that are simply trying to find truthy values. However the native type castings do not provide any typescript assertions, so the resulting type of the filter is unchanged. When manually providing these assertions,prefer-native-coercion-functions
should not suggest a native coercion over the manual callback.prefer-native-coercion-functions
Ideally that second example is ignored by this eslint rule because the custom assertions provide context that the native coercion function does not.
Alternatively the resulting array can just be manually typed casted, but I would argue that typescript's default typings via assertions is preferred.
Similarly I could provide some method like
isTruthy
but that will interfere with
no-array-callback-reference
.