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

VSCode类型提示含多余&符号,如何合并显示对象类型?

解决TypeScript路径参数类型提示合并问题

我编写了一个可从字符串中推断URL路径参数的TypeScript类型Params,代码如下:

type Params<Pathname extends string> = string extends Pathname
  ? Record<string, string | undefined>
  : Pathname extends `${string}:${infer Param}/${infer Rest}`
  ? {
      [k in Param extends `${infer P}?` ? P : Param]: Param extends `${string}?`
        ? string | undefined
        : string;
    } & Params<`/${Rest}`>
  : Pathname extends `${string}:${infer Param}`
  ? {
      [k in Param extends `${infer P}?` ? P : Param]: Param extends `${string}?`
        ? string | undefined
        : string;
    }
  : {};

目前遇到的问题是,VSCode的类型提示弹窗中,该类型会显示为多个用&连接的对象结构:

(parameter) params: {
    name: string;
} & {
    another: string | undefined;
} & {
    thing: string;
}

我试过添加Flatten类型,但VSCode提示仍无法展示合并后的单一对象,期望的类型提示效果是:

(parameter) params: {
    name: string;
    another: string | undefined;
    thing: string;
}

解决方案

添加一个Prettify工具类型,通过重新映射对象键的方式,让TypeScript将交叉类型合并为单一对象结构,修改后的完整代码如下:

// 用于合并交叉类型为单一对象的工具类型
type Prettify<T> = {
  [K in keyof T]: T[K];
} & {};

type Params<Pathname extends string> = string extends Pathname
  ? Record<string, string | undefined>
  : Pathname extends `${string}:${infer Param}/${infer Rest}`
  ? Prettify<{
      [k in Param extends `${infer P}?` ? P : Param]: Param extends `${string}?`
        ? string | undefined
        : string;
    } & Params<`/${Rest}`>>
  : Pathname extends `${string}:${infer Param}`
  ? Prettify<{
      [k in Param extends `${infer P}?` ? P : Param]: Param extends `${string}?`
        ? string | undefined
        : string;
    }>
  : {};

原理说明

Prettify类型通过遍历并重新定义对象的每个键值对,再与空对象交叉,会触发TypeScript的类型简化逻辑,将原本分散的交叉对象合并成一个统一的对象结构,从而让VSCode的类型提示展示出合并后的完整对象。

内容的提问来源于stack exchange,提问作者kjjd84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:57:40