我正在尝试做一个通用的反应形式减速器。为此,“值”必须具有“名称”的 T 类型。我不确定是否全面,所以这里有一个更清楚的例子:
例子:
type RandomObject = { test1: number, test2: string, test3: string[] }
type ActionChangeInput<T> = {
name: keyof T
value: typeof T["name"] // Get type of name
}
Run Code Online (Sandbox Code Playgroud)
我希望值是一个数字,因为名称的值是“test1”并且“test1”类型是数字。
const a: ActionChangeInput<RandomObject> = {
name: "test1", // type is "test1" | "test2" | "test3"
value: 12931 // Expect number here
}
Run Code Online (Sandbox Code Playgroud)
抱歉,如果不清楚,但很难解释我不明白的事情(这就是我在这里的原因)。
你想要的是ActionChangeInput<T>解决所有可能性的联合。您可以使用映射类型来实现此目的,该类型映射每个属性T并创建仅为该属性配对名称和值类型的类型。
就像是:
type ActionChangeInput<T> = {
[K in keyof T]: {
name: K
value: T[K]
}
}[keyof T]
Run Code Online (Sandbox Code Playgroud)
这映射了Twith中的每个属性[K in keyof T],并为nameasK和 value as的每个组合创建一个对象类型T[K]。
然后,您可以通过结果对象自己的键对其进行索引,以获得其值的并集。
对于该RandomObject类型,应该解析为:
type RandomObject = { test1: number, test2: string, test3: string[] }
type Test = ActionChangeInput<RandomObject>
/*
| { name: 'test1', value: number }
| { name: 'test2', value: string }
| { name: 'test3', value: string[] }
*/
Run Code Online (Sandbox Code Playgroud)
因此,该类型的任何有效值都必须具有name与该联合列表中匹配的值类型。
其余部分现在的行为如您所期望的:
type RandomObject = { test1: number, test2: string, test3: string[] }
// fine
const a: ActionChangeInput<RandomObject> = {
name: "test1",
value: 12931,
}
// error
const b: ActionChangeInput<RandomObject> = {
name: "test2",
value: 12931, // Type 'number' is not assignable to type 'string'.(2322)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |