reactjs - Vitest importActual: Jest იღებს ტიპებს, მაგრამ Vitest წერს „... არის უცნობი ტიპის“


მე ვმიგრირებ jest-იდან vitest-ში. პროცესში, მე ვამჟღავნებ შემდეგს:

// Jest
const myLib = jest.requireActual("mylib.js")

იმაზე:

// Vitest
const myLib = await vi.importActual("myLib.js")

დიდია, გარდა იმისა, რომ Jest-თან ტიპობრივი შეცდომები არ მაქვს, მაგრამ Vitest-თან მაქვს:

TS18046: myLib is of type unknown

მხოლოდ myLib-ის წევრებს ვიღებ წვდომას, და შემიძლია ვნახო, რომ ისინი სწორად არიან დაწერილი, მაგრამ ნებისმიერ წვდომაზე myLib-ზე წარმოიშობა შეცდომა:

// Thing[] is inferred. Error is on **myLib**.things
const things: Thing[] = myLib.things

როცა ვიკვლევ (უბრალოდ myLib-ზე კურსორის წაყვანით WebStorm-ში) ტიპს თითოეულ სცენარში, ვხედავ, რომ Jest აძლევს myLib-ის ტიპისთვის any, როცა Vitest აძლევს unknown.

ჩემს tsconfig.json-ში მაქვს noImplicitAny: true, ამიტომ ვფიქრობ, რომ any-ზე უნდა დავინახო შეცდომა.

მაგრამ მიუხედავად ყველაფრისა, რატომ არსებობს განსხვავება, როგორ შეუძლია TypeScript-ს გაარკვიოს, რომ myLib.things არის ტიპის Thing[] თუ myLib თვითონ არის unknown, და როგორ უნდა გავაკეთო ეს?

პასუხი #1

დაჰიავე ეს ჩემითვე და კოდის ხარისხის შემოწმებებმა დამიწყო ყვირილი. მჭირდება forwardRef მექრისთვის, მაგრამ, როგორც შენ შეეჯახე, await vi.importActual('react') უცნობი იყო;

მხარდაჭერა

import React from 'react';
vi.mock('my-module', async () => {
    const { forwardRef } = await vi.importActual<typeof React>('react');
    ...
});

ასე რომ, თუ ამ მოდულისთვის ტიპის განმარტება გაქვთ, შეგიძლიათ უბრალოდ გამოიყენოთ ის, მაგრამ ის ავტომატურად არ დაადგინებს.

პასუხი #2

მგონია, რომ ამასთან გამკლავების მარტივი გზა არის უბრალოდ გააკეთოთ await vi.importActual("myLib.js") as Record<{a: b}>, სადაც a არის ის წევრი, რომელსაც თქვენ ტესტში მიმართავთ და b არის ამ წევრის ტიპი. აქ unknown შეიძლება უკეთესი იყოს any -ზე, რადგან ეს აიძულებს თქვენ უფრო გააცნობიეროთ ეს.

თუმცა, მე ჯერ კიდევ ვერ ვხვდები, როგორ შეიძლებოდა Thing[]-ის განსაზღვრა unknown-იდან.