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-იდან.
