簡體   English   中英

Typescript:根據字符串[]返回映射對象數組

[英]Typescript: Return array of mapped objects based on string[]

我想創建一個 function,它基於字符串數組返回我需要的 mongo collections。

這就是我現在所處的位置。

type CollectionNames = 'users' | 'orders';

type CollectionMap = {
  users: User;
  orders: Order;
};

type CollectionsArray<T extends CollectionNames[]> = {
  [K in keyof T]: mongodb.Collection<CollectionMap[T[K]]>;
};

type CollectionAndConn<T extends CollectionNames[]> = {
  conn: mongodb.MongoClient;
  collections: CollectionsArray<T>; //mongodb.Collection<CollectionMap[T]>[];
};

export const mongo = async <T extends CollectionNames[]>(collectionNames: T): Promise<CollectionAndConn<T>> => {
  const conn = await MongoClient.connect(`${MONGO_URL}`, {});

  return {
    conn,
    collections: collectionNames.map((collectionName) => conn.db().collection(collectionName)) as CollectionsArray<T>,
  };
};

這就是我想這樣稱呼它:

    const {
      conn,
      collections: [usersCollection, ordersCollection],
    } = await mongo(['users', 'orders']);

現在我的 TS 認為 userCollection 和 ordersCollection 都是mongodb.Collection<User | Order> mongodb.Collection<User | Order>我想讓它知道 userCollection 應該是mongodb.Collection<User>和 ordersCollection 應該是mongodb.Collection<Order>基於字符串 [] 我傳遞給 ZC1C4252068E68394F1C1

/彼得

如果將mongo定義中的collectionNames: T替換為collectionNames: [...T] , TypeScript 會將 T 視為元組類型並推斷出正確的返回類型:

const mongo = async <T extends CollectionNames[]>(
  collectionNames: [...T]
): Promise<CollectionAndConn<T>> => {
  ..
}
const {
  conn,
  collections: [usersCollection, ordersCollection],
  // (property) collections: [mongodb.Collection<User>, mongodb.Collection<Order>]
} = await mongo(['users', 'orders']);

TypeScript操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM