![](/img/trans.png)
[英]Typescript confusion in generic `keyof` `extends keyof` `typeof` and others
[英]Typescript keyof generic AND extends a type
鑒於以下接口:
interface Payload {
value1: number;
value2: string;
}
我想創建一個接受函數Payload[]
並且只有的鍵Payload
擴展number
。 像這樣的東西:
function F<T, K extends keyof T, T[K] extends number>(arr: T[], property: K) {
//
}
function foo(payloads: Payload[]) {
F(payloads, "value1"); // should work
F(payloads, "value2"); // should not work because value2 is a string
F(payloads, "value3"); // should not work because value3 not in Payload[]
}
我使用只保留number
和number | undefined
的映射類型使其工作number | undefined
number | undefined
屬性:
interface Payload {
value1: number;
value2: string;
value3?: number;
value4?: string;
}
type NumberOnly<T> = {
// Doesn't allow `number | undefined` if `strictNullChecks` is enabled
//[key in keyof T as T[key] extends number ? key : never]: T[key];
// This will always allow `number | undefined` on top of just `number`
[key in keyof T as T[key] extends number | undefined ? key : never]: T[key];
};
function F<T extends NumberOnly<any>, K extends keyof NumberOnly<T>>(arr: T[], property: K) {
const value = arr[0][property];
return value;
}
function foo(payloads: Payload[]) {
F(payloads, "value1"); // should work
F(payloads, "value2"); // should not work because value2 is a string
F(payloads, "value3"); // should work (you can filter undefined if you want)
F(payloads, "value4"); // should not work because value4 is a string
F(payloads, "value5"); // should not work because value5 not in Payload[]
}
從技術上講,它也會接受value5: undefined
但不接受例如value5: string | undefined
value5: string | undefined
,一個無關緊要的邊緣情況。
它只接受value1
和value3
:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.