【问题标题】:Typescript : match function input type to output type in Array.reduce functionTypescript:将函数输入类型与 Array.reduce 函数中的输出类型匹配
【发布时间】:2021-04-08 14:02:32
【问题描述】:

尝试通过 Array.reduce 函数生成对象时遇到问题。此代码将在 javascript 中正常工作。但是在打字稿中,我无法匹配 reduce 函数中的类型,它会引发如下所示的错误。

这是一个小例子,在我的例子中,有更多的输入类型和 2-3 级处理,如下面的 buildSchema 函数。我更愿意通过 reduce 函数生成它们,而不是像下面的 morph 对象中所示手动列出它们。

知道如何通过类型系统解决这个问题吗?根据输入推断类型。所以我仍然可以拥有类型安全,但不必为不同的输入键一遍又一遍地复制粘贴相同的代码?

示例代码:


type inputs = "alpha" | "beta" | "gamma";

type AlphaSchema = {
    pet: string,
    house: string
}

type BetaSchema = {
    boss: string,
    work: string,
}

type GammaSchema = {
    monk: string,
    temple: string,
}

// Anything I can try using this type ? Using generics and keyof ?
// <T extends keyof Schemas> => Schemas[T] ?
type Schemas = {
    'alpha': AlphaSchema,
    'beta': BetaSchema,
    'gamma': GammaSchema 
}

type manualMorph = typeof morph

//////////////////////

const morphTypes : ["alpha", "beta", "gamma"] = ["alpha", "beta", "gamma"];

const buildSchema = {
    'alpha' : (str1: string, str2: string): AlphaSchema => { return {pet: str1, house: str2} },
    'beta' : (str1: string, str2: string): BetaSchema => { return {boss: str1, work: str2} },
    'gamma' : (str1: string, str2: string): GammaSchema => { return {monk: str1, temple: str2} }
}

// Manually generated morph object
const morph = {
    'alpha' : buildSchema['alpha'],
    'beta' : buildSchema['beta'],
    'gamma' : buildSchema['gamma'],
}

// Morph from reduce
const morphFromReduce: manualMorph = morphTypes.reduce((acc, type) => {

    acc[type] = buildSchema[type];
    return acc;
}, <manualMorph>{})

错误:

键入 '((str1: string, str2: string) => AlphaSchema) | ((str1:字符串,str2:字符串)=> BetaSchema)| ((str1: string, str2: string) => GammaSchema)' 不可分配给类型 '((str1: string, str2: string) => AlphaSchema) & ((str1: string, str2: string) => BetaSchema) & ((str1: string, str2: string) => GammaSchema)'。

输入 '(str1: string, str2: string) => AlphaSchema' 不可分配给类型 '((str1: string, str2: string) => AlphaSchema) & ((str1: string, str2: string) => BetaSchema) & ((str1: string, str2: string) => GammaSchema)'。

输入 '(str1: string, str2: string) => AlphaSchema' 不可分配给类型 '(str1: string, str2: string) => BetaSchema'.

类型 'AlphaSchema' 缺少类型 'BetaSchema' 的以下属性:boss

我正在使用打字稿 4.1.3

【问题讨论】:

    标签: typescript typescript-generics fp-ts


    【解决方案1】:

    这样就可以了;)

    const morphFromReduce = morphTypes.reduce(<T extends inputs>(acc: manualMorph, type: T) => {
        acc[type] = buildSchema[type];
        return acc;
    }, {} as manualMorph);
    

    【讨论】:

    • stackoverflow.com/users/1010868/tomasz-gawel 非常感谢!很长时间以来我一直在想弄清楚如何让它发挥作用!我刚刚创建了一个帐户,因此由于缺乏可信度,它不会让我投票。稍后会光临并投票!
    猜你喜欢
    • 2019-10-19
    • 2022-01-11
    • 2021-03-16
    • 1970-01-01
    • 2016-11-22
    • 2018-06-15
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多