TypeScript中保留类型推断元组:为何rest被推断为unknown[]
问题解答
这段代码里rest被推断为unknown[]是TypeScript的类型推断特性导致的,具体原因如下:
你的泛型_symbols约束是[any, ...string[]],但在映射类型的条件判断_key extends [any, ...infer rest]中,这里的any是无约束的宽泛类型,TypeScript不会自动把它和原泛型约束里的string[]关联起来。条件类型的模式匹配是独立进行的,它只识别_key的结构是[任意类型, ...剩余元素],因此剩余元素rest会被推断为最宽泛的unknown[],而非继承原泛型的string[]约束。
虽然最终输出结果符合预期,但这大概率是后续join类型对unknown[]做了兼容处理,或是实际传入的参数都是字符串类型,掩盖了类型推断的问题。
如果想让rest被正确推断为string[],可以把条件里的any替换成string,和原泛型约束保持一致:
type _join<_symbols extends [string, ...string[]]> = { [_key in _symbols as _key extends [string, ...infer rest] ? join<rest, '/'> : never]: _key[0]; };
或者如果需要保留any的灵活性,也可以通过显式约束rest的类型来修正:
type _join<_symbols extends [any, ...string[]]> = { [_key in _symbols as _key extends [any, ...infer rest] ? rest extends string[] ? join<rest, '/'> : never : never]: _key[0]; };
内容的提问来源于stack exchange,提问作者user1543574
相关产品推荐
相关产品推荐

