无法将 typescript 类型应用于派生的 svelte 存储

Pau*_*l A 2 typescript svelte svelte-store

我有一个工作派生商店,名为selectedDocument in svelte。当我尝试向其中添加正确的类型时,出现以下 TS linting 错误。(并且智能感知不起作用)

TS Linting 错误

关于selectedDocument存储的定义

Expected 2 type arguments, but got 1.ts(2558)
Run Code Online (Sandbox Code Playgroud)

上 ([$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)
Run Code Online (Sandbox Code Playgroud)

代码

商店可以工作,类型可以与其他类似数据一起工作

接口

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;
  }
  
Run Code Online (Sandbox Code Playgroud)

商店

const userDocuments = writable<Document[]>(); 

const selectedDocId = writable<string>(""); // Selected doucment Id

const selectedDocument = derived<Document>(
  [selectedDocId, userDocuments],
  ([$selectedDocId, $userDocuments]) =>
    getObjByIdReturnOneObj($userDocuments, $selectedDocId, "doc_id")
);
Run Code Online (Sandbox Code Playgroud)

函数 getObjByIdReturnOneObj 接受文档数组并返回单个对象(不在数组中)

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;
  }
  
Run Code Online (Sandbox Code Playgroud)

商店

const userDocuments = writable<Document[]>(); 

const selectedDocId = writable<string>(""); // Selected doucment Id

const selectedDocument = derived<Document>(
  [selectedDocId, userDocuments],
  ([$selectedDocId, $userDocuments]) =>
    getObjByIdReturnOneObj($userDocuments, $selectedDocId, "doc_id")
);
Run Code Online (Sandbox Code Playgroud)

函数 getObjByIdReturnOneObj 接受文档数组并返回单个对象(不在数组中)

H.B*_*.B. 8

如果您查看 的类型derived,您会发现它有两个类型参数。这是它最简单的签名:

export declare function derived<S extends Stores, T>(
  stores: S,
  fn: (values: StoresValues<S>) => T
): Readable<T>;
Run Code Online (Sandbox Code Playgroud)

目前,您不能只指定某些类型参数,要么全部指定,要么全无。一般来说,当参数可以自动导出时,我建议不要指定它们;它大多只会增加不必要的噪音。

getObjByIdReturnOneObj在这种情况下,如果您指定类型,第二个参数必须具有返回类型。

第一个还必须调整为至少包括Readable如下Stores定义:

declare type Stores =
  Readable<any> |
  [Readable<any>, ...Array<Readable<any>>] |
  Array<Readable<any>>;
Run Code Online (Sandbox Code Playgroud)

设置类型时,您还可以使用typeof从现有存储和函数派生类型:

const selectedDocument = derived<
    [typeof selectedDocId, typeof userDocuments],
    ReturnType<typeof getObjByIdReturnOneObj>
>(...)
Run Code Online (Sandbox Code Playgroud)

或者手动类似:

const selectedDocument = derived<
    [Readable<string>, Readable<Document[]>],
    Document // Based on type specified in question
>(...)
Run Code Online (Sandbox Code Playgroud)