Closed
Description
Before You File a Proposal Please Confirm You Have Done The Following...
- I have searched for related issues and found none that match my proposal.
- I have searched the current rule list and found no rules that match my proposal.
- I have read the FAQ and my problem is not listed.
My proposal is suitable for this project
- My proposal specifically checks TypeScript syntax, or it proposes a check that requires type information to be accurate.
- My proposal is not a "formatting rule"; meaning it does not just enforce how code is formatted (whitespace, brace placement, etc).
- I believe my proposal would be useful to the broader TypeScript community (meaning it is not a niche proposal).
Description
Unintuitively, TS narrows typeof x === 'function'
to the unsafe Function
type if x is not already constrained. However, it is safe to use on a constrained type. We should report on unconstrained callables.
Fail Cases
declare const maybeFunction: unknown;
if (typeof maybeFunction === 'function') {
// TS allows this.
maybeFunction('call', 'with', 'any', 'args');
}
Pass Cases
declare const maybeFunction: string | (() => string);
if (typeof maybeFunction === 'function') {
// TS errors if more args are provided than the declared call signature, so this is safe.
maybeFunction();
}
Additional Info
it's probably fine/good to allow typeof x === 'function
as long as x
isn't called. I'm not sure exactly where the line should be drawn between reporting and not reporting. It seems like it should be reported if we pass x
to a function that might expect a specific call signature. Maybe a heuristic could be typeof x === 'function
is ok as long as x
isn't referenced in the true
branch of the conditional?