我有這樣的代碼設定。
我希望回傳的資料具有動態型別約束。
type Schema = ('id' | 'name' | 'description' | 'content' | 'createdAt')[];
type Obj = {
id: number;
name: string;
description: string;
content: string;
createdAt: Date;
}
function getBySchema(schema: Schema) {
const result = /* Get the object of the specified field from somewhere according to the schema */
return result;
}
const picked = getBySchema(["id", "name"]);
// Expect it to pass.
picked.name
// Expect it not to pass.
picked.createdAt
我在函式的引數型別中指定 Schema 以獲得輸入提示。

如何根據模式的實際值動態計算結果型別?
我嘗試了以下方法,但似乎它是根據架構中的所有型別進行判斷的。
type PickBySchema<T extends Record<string, unknown>, S extends Schema> = S extends (infer I)[] ? I extends string ? {
[K in I]: T[K]
} : never : never;
uj5u.com熱心網友回復:
您可以使用ReadonlyArray和的組合<infer U> ? U : never來推斷傳遞下來的鍵元組,如下所示:
function getBySchema<T extends Schema>(schema: T): {
[key in (T extends ReadonlyArray<infer U> ? U : never)]: Obj[key]} {
解釋:
T extends Schema確保傳入的引數為schema: T型別Schema。- 要將傳入的模式條目用作回傳的物件鍵,我們首先需要使用映射型別創建一個介面,其中鍵是從傳入
Schema的字串的聯合派生的。為此,我們以正常方式啟動介面,然后不是參考型別或其鍵,而是擴展泛型變數以提取傳入的內容。我們首先斷言它是創建聯合并使用我們來做到這一點獲取對 T 有效的最小聯合型別(也就是傳入的內容)并使用. 用于表示如果無法推斷出并集,則該鍵不是有效值,無法創建。key inSchemaTReadonlyArrayinfer U? U: never - 一旦我們派生了可能的鍵的聯合,我們就創建相應的值型別,
Obj[key]以確保屬性值具有與鍵相關的正確型別。
游樂場鏈接。
對代碼庫的進一步改進:
您不必手動輸入型別內的鍵Obj并將它們分配給Schema型別。您可以使用以下方法自動執行此操作:
type Schema = (keyof Obj)[];
游樂場鏈接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482450.html
標籤:打字稿
