簡體   English   中英

如何在打字稿中使用不同類型的通用鍵鍵入對象

[英]How to type an object with generic keys of different types in typescript

你會如何在打字稿中輸入這個對象?

我有一個特殊的“日期時間”鍵是日期,其余的鍵是數字。 但我事先不知道將在每個對象上設置哪些鍵。 示例值:

type Metrics = ??????

const example1: Metrics = {
  datetime: new Date(),
  activity: 12.34,
  min: 12.34,
  max: 12.34,
}
const example2: Metrics = {
  datetime: new Date(),
  avg: 12.34,
}

這是我嘗試過的:

type Metrics = {
  datetime: Date,
  [key: string]: number,
}
// ERROR on the type definition:
// Property 'datetime' of type 'Date' is not assignable to string index type 'number'


type Metrics = { 
    datetime: Date 
} & {  
    [key: string]: number 
}
// ERROR on the variable assignment:
// Type '{ datetime: Date; activity: number; min: number; max: number; }' is not assignable to type 'Metrics'.
//   Type '{ datetime: Date; activity: number; min: number; max: number; }' is not assignable to type '{ [key: string]: number | null; }'.
//     Property 'datetime' is incompatible with index signature.
//       Type 'Date' is not assignable to type 'number'.

您將需要使用Record<Exclude<K,"datetime">, number>將所有現有鍵映射到類型 number 但排除鍵“datetime”的東西。 由於這對於通常的索引類型不一定可行,因此您最好使用將類型限制為泛型的輔助函數:

type Metrics<K extends keyof any> = { datetime: Date } & Record<Exclude<K, "datetime">, number>;

function makeMetrics<T extends Metrics<keyof T>>(metrics: T): T {
    return metrics;
}

const example1 = makeMetrics({
    datetime: new Date(),
    activity: 12.34,
    min: 12.34,
    max: 12.34,
});
const example2 = makeMetrics({
    datetime: new Date(),
    avg: 12.34,
});

這意味着兩個示例都只允許定義時存在的鍵,稍后添加額外的鍵將不會,以便您需要諸如“除datetime外的所有鍵都是數字”之類的東西,這在目前是不可能的我所知。

暫無
暫無

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

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