簡體   English   中英

打字稿:通過鍵通用從對象中獲取正確的值類型

[英]Typescript: Get correct value type from object by key generic

在示例中,我想編寫一個簡單的查詢構建器,其中所有類型的實體都正確轉換。 例如,當我使用 equalsTo 過濾名稱時,我只想允許字符串作為值,對於年齡來說,應該只允許數字。 現在 value 可以是 Dogs 的任何值,這不是我想要的。 有人可以幫助我這可能嗎?

class Dogs {
    name!: string;
    age!: number;
    alive!: boolean;
}
interface QueryBuilder<O extends object, F extends keyof O = keyof O> {
    equalsTo: (fieldName: F, value: O[F]) => boolean;
}
const queryBuilder = <O extends object>(): QueryBuilder<O> => ({
    equalsTo: (fieldName, value) => true 
})
const qb = queryBuilder<Dogs>();
qb.equalsTo("name", 1); // Should throw an error that only string is allowed as value
qb.equalsTo("age", "Rex"); // Should throw an error that only number is allowed as value

您的接口定義:

interface QueryBuilder<O extends object, F extends keyof O = keyof O> {
    equalsTo: (fieldName: F, value: O[F]) => boolean;
}

允許equalsTo的第二個參數為string | number | boolean string | number | boolean string | number | boolean ,因為 TypeScript 無法在級別進一步縮小類型。

但是- 如果您對函數本身進行類型注釋:

interface QueryBuilder<O extends object> {
    equalsTo: <F extends keyof O = keyof O>(fieldName: F, value: O[F]) => boolean;
}

...你得到你正在尋找的行為:

qb.equalsTo("name", 1); // Argument of type 'number' is not assignable to parameter of type 'string'.(2345)

qb.equalsTo("age", "Rex"); // Argument of type 'string' is not assignable to parameter of type 'number'.(2345)


TypeScript 游樂場

暫無
暫無

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

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