作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你会如何在 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
之外的所有键都是数字”之类的东西,这是不可能的我所知道的。
关于typescript - 如何在 typescript 中使用不同类型的通用键键入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64160111/
我是一名优秀的程序员,十分优秀!