打字稿:将函数输入类型与 Array.reduce 函数中的输出类型匹配
Typescript : match function input type to output type in Array.reduce function
我 运行 在尝试通过 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>{})
错误:
Type '((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) & ((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
这样就可以了 ;)
const morphFromReduce = morphTypes.reduce(<T extends inputs>(acc: manualMorph, type: T) => {
acc[type] = buildSchema[type];
return acc;
}, {} as manualMorph);
我 运行 在尝试通过 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>{})
错误:
Type '((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) & ((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
这样就可以了 ;)
const morphFromReduce = morphTypes.reduce(<T extends inputs>(acc: manualMorph, type: T) => {
acc[type] = buildSchema[type];
return acc;
}, {} as manualMorph);