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
相关产品推荐
相关产品推荐

