Kan ikke anvende TypeScript-type på en afledt Svelte-store
Jeg har en fungerende derivativ butik kaldet selectedDocument i Svelte. Jeg får følgende TS linting-fejl, når jeg forsøger at tilføje den korrekte type til den. (Og intellisense fungerer ikke)
TS-lintfejl
om definitionen af selectedDocument-lageret
Expected 2 type arguments, but got 1.ts(2558)
på ([$selectedDocId, $userDocuments])
Type '{ view_id: never; user_id: never; doc_id: never; user_name: never; user_avatar: never; cardMap: never; cards: never; }' must have a '[Symbol.iterator]()' method that returns an iterator.ts(2488)
KODEN
Butikken fungerer, og typen fungerer med andre lignende data
Grænseflader
export interface MainView {
view_id: string;
user_id: string;
doc_id: string;
user_name: string;
user_avatar: string;
cardMap: CardMap;
cards: {
[key: string]: Card;
};
}
export interface Document {
doc_id: string;
createDate: Date;
createdBy: string;
title: string;
}
Butikker
const userDocuments = writable<Document[]>();
const selectedDocId = writable<string>(""); // Selected doucment Id
const selectedDocument = derived<Document>(
[selectedDocId, userDocuments],
([$selectedDocId, $userDocuments]) =>
getObjByIdReturnOneObj($userDocuments, $selectedDocId, "doc_id")
);
Funktionen getObjByIdReturnOneObj tager arrayet af dokumenter og returnerer et enkelt objekt (ikke i et array)
export interface MainView {
view_id: string;
user_id: string;
doc_id: string;
user_name: string;
user_avatar: string;
cardMap: CardMap;
cards: {
[key: string]: Card;
};
}
export interface Document {
doc_id: string;
createDate: Date;
createdBy: string;
title: string;
}
Butikker
const userDocuments = writable<Document[]>();
const selectedDocId = writable<string>(""); // Selected doucment Id
const selectedDocument = derived<Document>(
[selectedDocId, userDocuments],
([$selectedDocId, $userDocuments]) =>
getObjByIdReturnOneObj($userDocuments, $selectedDocId, "doc_id")
);
Funktionen getObjByIdReturnOneObj tager arrayet af dokumenter og returnerer et enkelt objekt (ikke i et array)
Svar #1
Hvis du ser på typen af derived, vil du se, at den har to typeargumenter. Dette er dens simpleste signatur:
export declare function derived<S extends Stores, T>(
stores: S,
fn: (values: StoresValues<S>) => T
): Readable<T>;
I øjeblikket kan du ikke kun angive nogle af typeargumenterne, det er alt eller intet. Generelt vil jeg anbefale ikke at angive argumenterne, når de kan udledes automatisk; det tilføjer som regel bare unødvendig støj.
I dette tilfælde skal det andet argument have returtypen af getObjByIdReturnOneObj, hvis du specificerer typerne.
Den første skal også justeres for at inkludere mindst Readable, da Stores er defineret som:
declare type Stores =
Readable<any> |
[Readable<any>, ...Array<Readable<any>>] |
Array<Readable<any>>;
Når du angiver typerne, kan du også bruge typeof til at udlede typer fra de eksisterende stores og funktionen:
const selectedDocument = derived<
[typeof selectedDocId, typeof userDocuments],
ReturnType<typeof getObjByIdReturnOneObj>
>(...)
Eller manuelt noget som:
const selectedDocument = derived<
[Readable<string>, Readable<Document[]>],
Document // Based on type specified in question
>(...)
