![](/img/trans.png)
[英]How can I infer an object property's value in TypeScript when using mapped types?
[英]Infer object types by sibling property - Typescript
是否可以根据同一 object 中的另一个属性断言 object 的属性?
但是如何根据type
属性的values
推断值的类型呢?
type StepKeys = "Test1" | "Test2";
interface objectMap {
"Test1": {
name: string
},
"Test2": {
age: number
}
};
interface Step<T extends StepKeys = StepKeys> {
type: T;
value: objectMap[T]
};
const steps: Record<string, Step> = {
"Step1": {
type: "Test1",
value: {
}
}
}
这里values
的类型是{ name: string; } | { age: number; }
{ name: string; } | { age: number; }
{ name: string; } | { age: number; }
。
是否可以推断出它的可能值?
你好,如果你想有效地区分这个联合,类型参数不应该是一个联合,而是寻求将联合“推”到一种类型。 这是因为我们希望每个Step
类型都有自己唯一的类型参数,而不是可能类型参数的联合。 所以一个小的改变,但完成你想要的。
const steps: Record<string, Step<'Test1'> | Step<'Test2'>> = {
"Step1": {
type: "Test1",
value: {
// infer ?
age: 11,
// ^^^ correctly throws error
// Object literal may only specify known properties, and 'age' does not exist in type '{ name: string; }'.(2322)
name: 'test',
}
}
}
使用索引访问 map 类型,如果有更多的键/值对,您可以自动创建可区分的联合。
type Steps = Record<string, {
[key in StepKeys]: Step<key>
}[StepKeys]>
实现你想要的东西的唯一方法并不是很好,但它确实有效。 问题是你必须手动输入每个密钥(这使得它不可能通用或可扩展)。
interface PeoplePropsMap {
withName: {
name: string
},
withAge: {
age: number
}
};
type People =
{ type: 'withName', value: PeoplePropsMap['withName'] } |
{ type: 'withAge', value: PeoplePropsMap['withAge'] }
const steps: Record<string, People> = {
john: {
type: 'withAge',
value: {
age: 10
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.