You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:16:17