首页 > 解决方案 > 打字稿:如何合并此交集的表示(在工具提示中)?

问题描述

我有一个重载的函数:

interface FunctionWithOverload {
    (): {
        a: 1
        b: 1
    }

    <T>(arg: T): {
        a: 1
        b: 1
    } & (T extends number ? { c: 1 } : {})
}

const fwo: FunctionWithOverload = () => {return {} as any}

const result = fwo() // result has a nice type: {a: 1, b: 1}
const result1 = fwo(1) // result1 does not: {a: 1, b: 1} & {c: 1}

操场

如果你将鼠标悬停在result上面,你会看到它有一个不错的类型{a:1,b:1},您会在工具提示中result1,但类型很丑陋{a:1, b:1} & {c:1}

问题是:我如何以某种方式合并{a:1, b:1} & {c:1}{a:1, b:1, c:1}我的情况?

要求

函数重载必须保持原样,即不允许添加相互可选的属性c返回类型添加相互可选的属性。

任何类型的别名都不应添加到工具提示的输出中(除非这是解决此问题的唯一方法)。

漂亮很重要,因为它符合我的任务要求。

标签: typescripttypescript-typings

解决方案


我已经设法(在 TitianCernicova-Dragomir 的帮助下)解决了这个问题!像这样:

interface FunctionWithOverload {
    (): {
        a: 1
        b: 1
    }

    <T>(arg: T): Id<{
        a: 1
        b: 1
    } & (T extends number ? { c: 1 } : {})>
}

type Id<T>={} & { [P in keyof T] :T[P]}

const fwo: FunctionWithOverload = () => {return {} as any}

const result = fwo() // result has a nice type: {a: 1, b: 1}
const result1 = fwo(1) // result1 DOES HAVE TOO!!! {a: 1, b: 1, c: 1} 

操场

我认为它的工作方式可能是:TS 引擎将映射类型视为值得命名的类型,如接口,而任何联合、交集(如上面的解决方案)或基本类型(如字符串文字)则不是。


推荐阅读