You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:35:27