TypeScript:从接口动态创建联合类型

SIY1121

我想生成一个类型 Response

type Response = 
{
    code: 200
    body: {
        msg: string
    }
} | {
    code: 400
    body: {
        errorCode: number
    }
}

来自Foo生成的类型的简化版本

interface Foo {
    200: {
        msg: string
    }
    400: {
        errorCode: number
    }
}

我在下面尝试过,但是没有用。

type Response = {
    code: keyof Foo // 200 | 400
    body: Foo[keyof Foo] // {msg: string} | {errorCode: number}
}


const res: Response = {
    code: 200,
    body: {
        errorCode: 1 // not get an error
    }
}

有人能帮我吗?

贾卡尔兹

现在,您正在将所有可能的code类型与所有可能的body类型混合在一起您需要使用映射类型来显式遍历的每个KFoo并使每个元素成为K键和Foo[K]值的函数。这将产生一个新的对象类型{200: {code: 200, ...}, 400: {code: 400, ...},您需要查找对象类型以获取其属性的并集:

type Resp = { [K in keyof Foo]: { code: K, body: Foo[K] } }[keyof Foo];

/* type Resp = {
    code: 200;
    body: {
        msg: string;
    };
} | {
    code: 400;
    body: {
        errorCode: number;
    };
} */

(我将其重命名,Resp因为已经有一个Response我不想与之发生冲突的全局范围)。

然后body,在给定的条件下使用错误时,您将得到所需的错误code

const res: Resp = {
    code: 200,
    body: {
        errorCode: 1 // error!
    //  ~~~~~~~~~~~~
    // Type '{ errorCode: number; }' is not assignable to type '{ msg: string; }'.
    }
}

操场上的代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Typescript联合类型:处理接口

来自分类Dev

联合类型/扩展接口

来自分类Dev

TypeScript动态联合

来自分类Dev

如何从TypeScript中的界面创建联合或选择类型?

来自分类Dev

TypeScript联合函数类型

来自分类Dev

TypeScript和联合类型

来自分类Dev

使用包含联合类型的详尽属性列表创建接口/类型别名?

来自分类Dev

如何在TypeScript中使用具有接口联合类型的实例?

来自分类Dev

Typescript - 使用泛型扩展具有联合类型属性的接口

来自分类Dev

TypeScript联合类型需要长度

来自分类Dev

Typescript联合类型通用参数

来自分类Dev

重载TypeScript中的联合类型

来自分类Dev

如何检查接口类型的联合参数

来自分类Dev

确保接口与联合类型一致?

来自分类Dev

区分联合派生TypeScript接口

来自分类Dev

从键的联合创建对象类型

来自分类Dev

Typescript如何将接口的动态([键:类型]:类型)和静态类型混合使用

来自分类Dev

根据类型数组创建联合类型

来自分类Dev

如何从记录类型创建区分联合类型?

来自分类Dev

如何处理Duck类型的TypeType接口的联合类型?

来自分类Dev

如何使用类型防护解决接口的打字稿联合类型

来自分类Dev

如何使用Typescript基于值创建动态类型

来自分类Dev

调用动态类型的接口方法

来自分类Dev

通过接口动态创建类

来自分类Dev

在TypeScript中使用联合类型键入数组?

来自分类Dev

TypeScript和React中的联合类型道具

来自分类Dev

Typescript联合类型引发错误

来自分类Dev

Typescript-从联合或数组派生对象类型

来自分类Dev

Typescript:返回预定义联合类型的函数