Make sure TypeScript is making the expected type inference from your types.
npm i ts-inference-check --save-dev
👉 Check if inferred type of some obj
is SomeType
(and is not SomeOtherType
):
import { type } from 'ts-inference-check'
type(obj).is<SomeType>(true)
type(obj).is<SomeOtherType>(false)
☝️ type(...).is<T>(true)
will result in a compiler error if inferred type is not T
.
Similarly, type(...).is<T>(false)
will result in a compiler error if inferred type is T
.
Example usage in Jest (you can use with any testing library):
import { type } from 'ts-inference-check'
test('something', () => {
// ...
expect(type(obj).is<SomeType>(true)).toBe(true)
expect(type(obj).is<SomeOtherType>(false)).toBe(false)
// ...
})
💡
type(...).is<T>()
only acceptstrue
if inferred type isT
, and only acceptsfalse
if inferred type is notT
. It will return the given value untouched. All other methods oftype(...)
ortype<T>()
behave in the same manner.
👉 Check if inferred type is subtype of SomeType
(and is not subtype of SomeOtherType
):
type(obj).extends<SomeType>(true)
type(obj).extends<SomeOtherType>(false)
👉 Check if inferred type is super type of SomeType
(and is not supertype of SomeOtherType
):
type(obj).isExtendedBy<SomeType>(true)
type(obj).isExtendedBy<SomeOtherType>(false)
👉 Pass type arguments instead of values:
type<A>().is<B>(true)
type<A>().extends<B>(true)
type<A>().isExtendedBy<B>(true)
👉 any
passes most of the checks described above. Use type(...).strictly
to avoid this:
type(obj).strictly.is<SomeType>(true)
type(obj as any).is<SomeType>(true)
type(obj as any).strictly.is<SomeType>(false)
type(obj as any).extends<SomeType>(true)
type(obj as any).strictly.extends<SomeType>(false)
type(obj as any).isExtendedBy<SomeType>(true)
type(obj as any).strictly.isExtendedBy<SomeType>(false)
👉 Use .isAny()
to check if inferred type is any
:
type(obj as any).isAny(true)
type(obj).isAny(false)
Simply be nice and respectful to other people. Here are some useful commands for contributing:
git clone git@github.com:loreanvictor/ts-inference-check.git # 👉 clone the code (generally fork it before cloning though)
npm i # 👉 install all dependencies
npm test # 👉 run the tests
npm run coverage # 👉 check code coverage
npm run lint # 👉 check code style
npm run lint:fix # 👉 fix trivial stylistic issues
When making a PR, make sure all checks pass. Specifically, run tests, check coverage and check the linter to ensure they all pass.