javascript - 如何在 TypeScript 中将一个泛型类型的结构复制到另一个泛型?

标签 javascript typescript typescript-generics

假设我们有以下输入类型:

interface Input {
    name: string;
    heightCm: number;
    dob: Date;
}

我想编写一个函数,可以根据此输入生成以下输出类型:

interface Output {
    name: boolean;
    heightCm: boolean;
    dob: boolean;
}

换句话说,一个函数复制输入的结构并将该结构作为输出返回,将所有值设置为 bool 值。

函数签名看起来像这样:

interface GenericMap<T> {
    [key: string]: T;
}

type InputToOutput<In, Out extends GenericMap<boolean>> = (input: In) => Out;

如果 Input 属性的类型最初是字符串,则将该属性标记为 true,否则标记为 false

例如该函数将根据上面的 Input 产生以下结果:

{
    name: true,
    heightCm: false,
    dob: false
}

但最重要的是,它必须是类型安全的,这样我才能接收到结果对象的智能感知。

非常感谢帮助!

最佳答案

我认为您只需要一个将每个属性的类型设置为 bool 值的映射类型?

type GenericMap<T> = {
    [K in keyof T]: boolean
}

你会这样使用:

interface Input {
    name: string;
    heightCm: number;
    dob: Date;
}

type Output = GenericMap<Input>
// Output is
// {
//    name: boolean;
//    heightCm: boolean;
//    dob: boolean;
// }

Playground


作为(潜在的)改进,您甚至可以检查此类型别名中的 string 并返回 truefalse,而不是 bool 值

type GenericMap<T> = {
    [K in keyof T]: T[K] extends string ? true : false
}

哪个会产生这种类型:

type Output = GenericMap<Input>
// {
//    name: true;
//    heightCm: false;
//    dob: false;
// }

关于javascript - 如何在 TypeScript 中将一个泛型类型的结构复制到另一个泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68105392/

相关文章:

typescript - 为什么这个 Typescript 泛型类型推断失败?

javascript - 使用CasperJS将法语字符写入CSV文件,但显示不正确

javascript - Safari 不触发表单提交

Typescript 不相信一定会在对象中创建属性

javascript - Angular OnPush 更改检测传播到 ngFor 循环中的子组件

typescript - 从类型中动态排除某个键

javascript - JQuery animate 完整功能未运行

javascript - 在 javascript 上交换大小写

html - 编译 Azure DevOps Widget : Can't resolve 'TFS/Dashboards/WidgetHelpers' 时出错

带有通用类型的 Typescript 装饰器