TypeScript映射类型中校验actions属性及回调返回值问题
TypeScript泛型校验问题:验证对象actions属性下所有回调返回string
你的HasStringReturn泛型逻辑存在错误,导致符合条件的StringCallback传入后返回'Something went wrong'。核心问题是你错误地遍历了整个Options的顶级键,而非actions内部的属性键。
错误原因分析
原代码中,约束里的[K in keyof Options]会遍历Options的所有顶级键(也就是'actions'),随后判断Options[K](即整个actions对象)是否是() => string类型——显然对象不可能是函数,因此条件永远不满足,返回错误提示。
修正方案
我们需要先定位actions的类型,再校验其内部每个属性是否为返回string(或其子类型,比如字面量字符串)的函数。以下两种方案都可以解决问题:
方案一:使用infer提取并校验
type HasStringReturn<Options> = // 先校验Options包含actions属性,提取其类型为Actions Options extends { actions: infer Actions } ? // 校验Actions中每个属性都是返回string的函数(参数任意) Actions extends { [K in keyof Actions]: (...args: any[]) => string } ? Options : 'Something went wrong' : 'Something went wrong';
方案二:直接映射actions内部属性
type HasStringReturn<Options> = Options extends { actions: { [K in keyof Options['actions']]: () => string } } ? Options : 'Something went wrong';
测试验证
用你的StringCallback测试,现在会正确返回原类型:
type StringCallback = { actions: { test: () => 'i love owls i really do.' } } type FinalCheck = HasStringReturn<StringCallback>; // 类型为StringCallback
如果传入不符合要求的类型,比如actions里有返回非string的函数,会返回错误提示:
type InvalidCallback = { actions: { test: () => number, foo: () => string } } type InvalidCheck = HasStringReturn<InvalidCallback>; // 类型为'Something went wrong'
内容的提问来源于stack exchange,提问作者BARNOWL
相关产品推荐
相关产品推荐

