我想将某些字段的数据更改为自定义类型.

例如,我想将TSomeType的b字段更改为自定义类型,以获得TSomeTypeConverted类型.

// original type
type TSomeType = {
    a: boolean;
    b: string;
}
// result what I want
type TSomeTypeConverted = {
    a: boolean;
    b: TCustomType;
}

通过应用下面的TConvertToCustomType获得了类似的结果.

type TConvertToCustomType<T, K extends keyof T> = Omit<T, K> & {[P in K]: TCustomType};

type TSomeTypeConverted = TConvertToCustomType<TSomeType, 'b'>
/* type TSomeTypeConverted = {
    a: boolean;
    b: TCustomType;
} */

但是,在此过程中,所有可选值都更改为required.

// before
type TSomeType = {
    a: boolean;
    b: string;
    c?: string; // optional
}
type TSomeTypeConverted = TConvertToCustomType<TSomeType, 'b' | 'c'>
/* type TSomeTypeConverted = {
    a: boolean;
    b: TCustomType;
    c: TCustomType; // not optional anymore
} */

有没有一种方法可以在保持可选状态的同时只更改类型?

推荐答案

你可以使用Mapped TypesConditional Type,而不是Omit对象:&

type TConvertToCustomType<T, K extends keyof T> = { [P in keyof T]: P extends K ? TCustomType : T[P] };

type TSomeTypeConverted = TConvertToCustomType<TSomeType, 'b' | 'c'>
/* type TSomeTypeConverted = {
    a: boolean;
    b: TCustomType;
    c?: TCustomType; // preserves optional flag
} */

Playground Link

Typescript相关问答推荐

如何在不使用变量的情况下静态判断运算式的类型?

webpack错误:模块找不到.当使用我的其他库时,

根据上一个参数值查找参数类型,也返回类型

打字脚本中泛型和直接类型重新映射的不同行为

如何在LucideAngular 添加自定义图标以及如何使用它们

带switch 的函数的返回类型的类型缩小

如何将泛型对象作为返回类型添加到类型脚本中

通过按键数组拾取对象的关键点

嵌套对象的类型

函数重载中的不正确TS建议

正确使用相交类型的打字集

有没有办法在Zod中使用跨字段验证来判断其他字段,然后呈现条件

我怎样才能正确地输入这个函数,使它在没有提供正确的参数时出错

为什么发送空字段?

在TS泛型和记录类型映射方面有问题

如何调整项目数组,但允许权重影响顺序

React-Router V6 中的递归好友路由

包含多个不同类构造函数的接口的正确类型?

解析错误:DeprecationError: 'originalKeywordKind' 自 v5.0.0 起已被弃用,无法再使用

是否有可能不允许在 TypeScript 中设置类属性,但也会抛出运行时错误?