【问题标题】:Typescript: how to merge the representation (in tooltip) of this intersection?打字稿:如何合并此交集的表示(在工具提示中)?
【发布时间】:2019-05-28 08:33:25
【问题描述】:

我有一个重载的函数:

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}

Playground

如果您将鼠标悬停在result 上,您可以在工具提示中看到它有一个很好的类型{a:1,b:1},但是result1 有一个丑陋的类型{a:1, b:1} &amp; {c:1}

问题是:我如何以某种方式将{a:1, b:1} &amp; {c:1} 合并到{a:1, b:1, c:1}

要求

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

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

漂亮很重要,因为这是我的任务要求。

【问题讨论】:

  • 您可以尝试使用Id 映射类型type Id&lt;T&gt;={ [P in keyof T] :T[P]} ,但编译器有时会扩展映射类型,有时却不会......
  • @TitianCernicova-Dragomir 嗨,Titian,新年快乐!有趣的是,它甚至没有帮助,我试过了,产生:Id&lt;{a:1,b:1} &amp; {c:1}&gt;。可能我这样写错了:&lt;T&gt;(arg: T): Id&lt;{..。哦,等等,我明白了,您的意思正是有时扩展有时不扩展
  • 也祝你新年快乐 :)。是的,这正是我的意思,在这种情况下很难让编译器做你想做的事......我一直想看看编译器代码,看看它如何决定扩展什么,什么不扩展,但还没有得到一个机会
  • @TitianCernicova-Dragomir 我有好消息!你知道我是如何设法扩展映射类型的(如果 expand 意味着删除类型别名并显示为纯对象文字类型)?这个:type Id&lt;T&gt;={} &amp; { [P in keyof T] :T[P]}!诡异的!任何想法为什么会发生这种情况? :D

标签: typescript typescript-typings


【解决方案1】:

我已经设法(在 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} 

Playground

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

【讨论】:

  • 就像我在 cmets 中所说的那样......
  • 我只是在一个复杂的例子中尝试了它,我也因缺乏扩展而感到沮丧,但它起作用了,看起来交叉点有帮助:)
  • @TitianCernicova-Dragomir 我认为它的工作方式可能是:TS 引擎将映射类型视为值得命名的类型,如接口,而任何联合、交叉或基本类型(如字符串文字)则不是!
  • 也许 .. 但我确信我也看到了映射类型的扩展。
  • @TitianCernicova-Dragomir 你的意思是映射类型分配给一个类型别名?嗯..好吧,我希望这不会发生在我的案子上。顺便说一句,如果你找到这样的例子,请告诉我!我很好奇是什么导致了这种行为。
猜你喜欢
  • 2021-07-03
  • 2019-11-12
  • 1970-01-01
  • 2020-05-10
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多