簡體   English   中英

Typescript keyof generic AND 擴展一個類型

[英]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[]
}

看游樂場

我使用只保留numbernumber | 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 ,一個無關緊要的邊緣情況。

它只接受value1value3

示例結果

基於使用TypeScript 4.1 功能的這個答案

暫無
暫無

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

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