如何将一种泛型的结构复制到另一种泛型,用自定义值替换原始值?

谢恩·卡拉南

首先阅读这个问题可能会有所帮助:如何在 TypeScript 中将一种泛型类型的结构复制到另一种泛型?

给定以下输入类型:

interface InputType {
    age: number;
    surname: string;
}

我想要一个可以为上述输入生成以下输出类型的函数:

type OutputValue<T> = (val: T) => void;

interface OutputType {
    age: OutputValue<number>;
    surname: OutputValue<string>;
}

这个函数的签名是:

type OutputType<T> = {
    [k in keyof T]: OutputValue<T[k]>
}

type TransformationFunction<Input, Output extends OutputType<Input>> = (input: Input) => Output;

上面的类型签名将确保输出是类型安全的。这意味着我可以使用智能感知来正确检索output.surname函数(例如)。

棘手的部分是以类型安全的方式返回正确的数据结构。

这是我的尝试:

const transformString = (stringValue: string) => {
    return (val: string) => {
        // some code processing val
    }
}

const transformationFunction = function<Input, Output extends GenericMap<Input>>(input: Input): Output {
    const keys = Object.keys(input) as Array<keyof Input>;

    return keys.reduce((output: Output, key: keyof Input) => {
        const inputValue = input[key];

        if (/*typeguard*/ isString(inputValue)) {
            return transformString(inputValue); // typescript compiler complains
        }
        else if ( /*typeguard*/ isNumber(inputValue)) {
            return transformNumber(inputValue); // similar function to above + typescript complains
        }
        else {
            throw new Error("No transform");
        }
    }, {} as Output)
}

如何将自定义值应用于输出对象?

实际问题的操场

让-阿尔方斯

使用for循环代替reduce,这成为可能:

(output[key] as unknown as OutputValue<string>) = transformString(inputValue)

而不是return transformString(inputValue)期望OutputValue<Input[keyof Input]>

游乐场链接

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将一种泛型类型(嵌套对象)的结构复制到 TypeScript 中的另一种泛型?

如何将字段从一种结构复制到另一种结构

如何将结构向量复制到另一种具有重复的结构向量

如何将任何类型的泛型类型转换为另一种类型

如何将产品的分类单元从一种产品复制到另一种产品

如何将文件从一种用途复制到另一种用途?

将输入值从一种形式复制到另一种形式

如何将一种自定义帖子类型的所有帖子显示到另一种自定义帖子框中?

将消费者泛型类型转换为另一种类型

如何将值从一种方法传递到另一种方法?

如何将值从一种形式传递到另一种形式的动态创建的控件

Python Flask-如何将值从一种途径传递到另一种途径?

提交时如何将值从一种形式传递到另一种形式?

如何创建泛型类类型作为另一种类型的子集

泛型类的 Swift 扩展类型约束,其中泛型类型是另一种泛型类型

将数据从一种纹理复制到另一种-OpenGL

在Swift中是否有一种方法可以将泛型约束为一种类型或另一种类型?

将数据从一种测量复制到另一种时,如何插入当前时间?

jQuery-将输入值从一种形式复制到另一种形式(形式和输入名称相同)

使用 C# 反射将一种类型的对象的值复制到另一种类型的对象

用另一种形式写以一种形式定义的变量的值

将值从一种模型传递到另一种模型的形式

在另一种支持泛型的类型中使用impl Trait

在C#中将泛型强制转换为另一种类型

如何将一种类型传递给 Rust 中用两种类型定义的泛型?

如何将值从一种用户窗体的代码传递给另一种

如何将一种方法的返回值传递给另一种方法?

如何将一种资源的输出值分配为另一种资源的输入?

如何将int值从一种方法转换为另一种方法