Giter VIP home page Giter VIP logo

Comments (5)

hi-ogawa avatar hi-ogawa commented on May 28, 2024 1

It might be that "tip" is outdated or simply wrong. Currently, vitest --typecheck cannot test single test file in both mode and prioritized typecheck mode. See also:

I'm not sure what's the best way to do this currently other than running vitest twice.

from vitest.

mrazauskas avatar mrazauskas commented on May 28, 2024

I'm not sure what's the best way to do this currently other than running vitest twice.

Note that // @ts-expect-error can hide typos in type names as well. Those are stripped entirely. Nor executing the test files, neither running vitest twelve times can help.

Solution: the old good Separation of Concerns principle. Use JavaScript testing tool to test runtime behaviour. Use specialised type testing tool to test types. There are at least two type testing tools which offer a type error assertion instead of // @ts-expect-error. The comment belongs to compiler, it is not meant for testing types.

from vitest.

danwithabox avatar danwithabox commented on May 28, 2024

@mrazauskas

There are at least two type testing tools which offer a type error assertion instead of // @ts-expect-error.

Could you please refer to these tools for clarity?

With Vitest, I gravitated towards @ts-expect-error as the most readable solution, and I will probably keep using it despite the possible issues highlighted, unless said tools are better, because the alternative was rather messy.

A minimal example of my use case, for context:

// to test against
function argFail<const T extends [1, never, 3]>(...arg: T) {}

//#region readable
argFail(
    1,
    // @ts-expect-error invalid
    2,
    3,
);
//#endregion

//#region messy, but intended way of testing, with expect-type?
type argFail_params = Parameters<typeof argFail>;
const arg = [1, 2, 3] as const;
expectTypeOf(arg[1]).not.toMatchTypeOf<argFail_params[1]>();
//#endregion

In a realistic scenario, argFail's arg: T parameter might also become too complex to properly extract it and make it testable without going somewhat mad.

Much more practical to just test a natural invocation of argFail with a not-quite-intended @ts-expect-error, that is resilient to refactors, than to bring in what I would consider a brittle and indirect way of expressing what I want to test.

from vitest.

mrazauskas avatar mrazauskas commented on May 28, 2024

Could you please refer to these tools for clarity?

Sure. I had in mind:

  • tsd (not recommended: still maintained, but it did not receive any significant improvement for very long time);
  • and tstyche (my own project: does more than tsd could and I work on more features).

To be honest, a type error assertion is not an ideal solution too. It would be the best to have .not.toBeCallableWith() matcher. As you know, expect-type has .toBeCallableWith(), but it does not work with function overloads and generic functions. They do not implement .not.toBeCallableWith() at all, but suggest to use // @ts-expect-error.

This matcher is complex. The most interesting part is to resolve argument types of generic functions. Programatically this is possible and I have a working prototype. That means that eventually tstyche will have .not.toBeCallableWith() with support for overloaded and generic functions.

from vitest.

danwithabox avatar danwithabox commented on May 28, 2024

Cheers, as I suspected there's not really a canonical way to go about this, and so I will stick to @ts-expect-error.

I will leave it to the maintainers to decide about the tip in the docs, but if I may provide input, it did waste me some time to realize that it's not working as intended, and at least some warning around it would be a welcome addition while the upstream issues are resolved.

from vitest.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.