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

TypeScript中派生类型的正确类型描述方法及StompJS复用连接订阅的类型错误求助

TypeScript中派生类型的正确类型描述方法及StompJS复用连接订阅的类型错误求助

你好呀!看你描述的StompJS复用连接订阅时碰到的TypeScript类型问题,太有共鸣了——明明代码逻辑没问题,但TS就是揪着类型报错,压制错误又总觉得心里不踏实对吧?

先把你贴的代码补全(看起来最后有点笔误,我修正了下):

const RESULT_PARSER_BY_TOPIC = {
    '/topic/user': (value: string): { id: string } => JSON.parse(value),
    '/topic/game': (value: string): string => value
};

这个问题核心在于TypeScript对对象的类型推断默认会做宽泛处理,如果不给这个解析器对象明确的类型约束,TS会把它推断成类似{ [key: string]: (value: string) => unknown }的类型,这样后续调用解析函数时,返回值类型会被识别为unknown,自然就会触发类型错误。

给你两个实用的解决方案:

方案一:明确定义解析器对象的类型

先给每个主题的解析函数定好类型,再约束整个对象:

// 先定义每个主题对应的解析函数类型
type TopicParserMap = {
  '/topic/user': (value: string) => { id: string };
  '/topic/game': (value: string) => string;
};

// 给对象加上类型约束
const RESULT_PARSER_BY_TOPIC: TopicParserMap = {
  '/topic/user': (value) => JSON.parse(value),
  '/topic/game': (value) => value
};

这样TS就能精准识别每个主题对应的解析函数返回类型,调用时不会再报错。

方案二:用泛型函数做类型安全的调用

如果后续要扩展更多主题,还可以写一个泛型函数来封装调用逻辑,让TS自动推导返回类型:

const RESULT_PARSER_BY_TOPIC = {
  '/topic/user': (value: string): { id: string } => JSON.parse(value),
  '/topic/game': (value: string): string => value
} as const; // 用as const让TS锁定对象的字面量类型

// 泛型函数,自动推导主题对应的返回类型
function parseTopicValue<T extends keyof typeof RESULT_PARSER_BY_TOPIC>(
  topic: T,
  value: string
): ReturnType<typeof RESULT_PARSER_BY_TOPIC[T]> {
  return RESULT_PARSER_BY_TOPIC[topic](value);
}

// 使用示例,TS会自动推导返回类型
const userData = parseTopicValue('/topic/user', '{"id": "user123"}');
// userData类型是{ id: string }
const gameData = parseTopicValue('/topic/game', 'game_status');
// gameData类型是string

as const的作用是让TS把对象的键和值都当成字面量类型,而不是宽泛的string或函数类型,这样泛型就能精准匹配每个主题对应的解析函数返回值。

这两种方法都能从根源上解决类型错误,不用再靠压制错误来“作弊”啦~

备注:内容来源于stack exchange,提问作者Grompok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:42:56