如何在TypeScript中创建动态条件类型?
TypeScript 类型约束需求与问题
目标效果
我想要实现的类型约束效果如下,确保type字段与payload类型严格绑定:
type A = { foo: number; } type B = { bar: string; } type ListOfTypes = [A, B]; type ListOfPayloads = { A: A; B: B; } type TheoryType = // 此处需填入实现代码 // 符合预期的合法示例 const a: TheoryType = { type: "A", payload: { foo: 123 } } const b: TheoryType = { type: "B", payload: { bar: "123" } }
已知简化实现
我知道可以通过以下方式简化实现:
type TheoryType<T extends A | B> = T
或者使用函数明确返回特定类型,但我想探索TypeScript的特性极限,尝试更贴合需求的实现方式。
当前实验代码
我目前的实验成果如下:
const TYPES_NAMES = { A: "A", B: "B", } as const; type ObjectValues<T> = T[keyof T]; export type TYPES = ObjectValues<typeof TYPES_NAMES>; export type PAYLOADS = { A: A; B: B; }; export type TYPE_PAYLOADS<T extends keyof PAYLOADS> = PAYLOADS[T]; export type BODY<Key extends TYPES> = { type: Key; payload: TYPE_PAYLOADS<Key>; } export type MESSAGE = { [Key in TYPES]: BODY<Key> }
存在的问题
上述代码接近目标,但使用MESSAGE类型时,无法约束type与payload的匹配关系,允许任意组合:
// 符合预期:类型校验通过 const body: BODY<"A"> = { type: "A", payload: { foo: 123 } } // 符合预期:类型校验报错(payload类型不匹配) const body: BODY<"A"> = { type: "A", payload: { bar: "123" } } // 不符合预期:两种情况均通过校验,未约束type与payload的对应关系 const body: MESSAGE = { type: "A", payload: { foo: 123 } } const body: MESSAGE = { type: "A", payload: { bar: "123" } }
内容的提问来源于stack exchange,提问作者Pablo Cawich II
相关产品推荐
相关产品推荐

