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
>(...)

Relaterede artikler