-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Validate types with tsc without skipLibCheck option + introduce type declaration checking #38
Conversation
Great! Thanks! Could you please take a look at CI failures? |
Most types were already defined, but just not correctly imported
CreateOptions was expecting a type for its generic Also export ProtocolID from @anycable/core
@palkan is there a way for me to kick off another CI run, or can only you do that? |
It's only me for first-time PRs; as soon as we get this merged, all your subsequent PRs will run automatically. |
Looks like we need to add some configuration to ignore |
I can repro now with Those type failures are caused by swapping the position of the
Fixed the declaration with the second-to-last commit.
Seems the above is common enough in check-nts that their FAQ addresses it by adding |
Protocol's reset parameter is typed `ReasonError`, a superset of `Error`, so ActionCableProtocol should use the same type
With `skipLibCheck` omitted, Channel#perform would fail tsc with: ``` Type 'ActionsType[A]' does not satisfy the constraint '(...args: any) => any'. Type 'ActionsType[keyof ActionsType]' is not assignable to type '(...args: any) => any'. Type 'ActionsType[string] | ActionsType[number] | ActionsType[symbol]' is not assignable to type '(...args: any) => any'. ``` This is because `Parameters` expects to take in a function, but the existing ternary doesn't ensure that it's being called on a function. Parameters: https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype So we should use the `ActionsType[A] extends () => void` to guard for a function, but that was too strict because it would only match against functions that took _no_ parameters. If we expand the type to take any function with any amount of parameters, then we can safely call `Parameters` on `ActionsType`. And we can use the `[]` at the very end to accept any other type `ActionsType` might be. Co-authored-by: throwandgo <[email protected]>
@palkan can I please trouble you to kick off another CI run? Also, the last commit with introducing a secondary typescript config file may be a bit controversial. I wish the logic was inverted where |
It looks like in tsconfig.json, the `skipLibCheck` flag was added so that check-dts could ignore these external errors: ``` ✖ node_modules/@types/node/globals.d.ts:67:13: Type error TS2502 'AbortController' is referenced directly or indirectly in its own type annotation. ✖ node_modules/@types/node/globals.d.ts:74:13: Type error TS2502 'AbortSignal' is referenced directly or indirectly in its own type annotation. ``` See the check-dts FAQ for their guidance: https://github.com/ai/check-dts/blob/7020f61159798fbe19d2a1e38aadd75ab0c7ccc5/README.md#i-am-getting-an-error-from-node-types-how-do-i-skip-node_modules But adding that flag meant the type declaration files (*.d.ts) in this anycable-client repo were skipped, so any errors were overlooked. This has downstream effects for any consumers of the anycable-core or anycable-web packages. If any declaration files had type errors (as they did), and the consumers did not set `skipLibCheck` in their tsconfig, then they'd experience a failure in their repo as evidenced in issue #39. So it's prudent for us to _not_ skip checking the type declarations. `tsc` and `check-dts` both read from tsconfig.json, but we can point `tsc` to a different configuration file that omits `skipLibCheck` and ensures this repo's declaration files are checked. Added the tsc type check at the front because it's the quickest test, so tests will fail early and fast if there's an error.
Thanks! Upgrading |
Hi Vova, I experienced a number of type errors when I imported the @anycable/web package into my codebase, but didn't notice the errors when I pulled down anycable-client and ran
yarn tsc
. Realized it was becauseskipLibCheck
in tsconfig.json had skipped checking the type declaration files (*.d.ts) in this repo.AbortController
andAbortSignal
, so added it back to tsconfig.json after I was donetsc
using a different config (noskiplibcheck_tsconfig.json) that will check the type declarations in this repo