【发布时间】: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}
如果您将鼠标悬停在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。
不应将任何类型别名添加到工具提示的输出中(除非这是解决此问题的唯一方法)。
漂亮很重要,因为这是我的任务要求。
【问题讨论】:
-
您可以尝试使用
Id映射类型type Id<T>={ [P in keyof T] :T[P]},但编译器有时会扩展映射类型,有时却不会...... -
@TitianCernicova-Dragomir 嗨,Titian,新年快乐!有趣的是,它甚至没有帮助,我试过了,产生:
Id<{a:1,b:1} & {c:1}>。可能我这样写错了:<T>(arg: T): Id<{..。哦,等等,我明白了,您的意思正是有时扩展有时不扩展 -
也祝你新年快乐 :)。是的,这正是我的意思,在这种情况下很难让编译器做你想做的事......我一直想看看编译器代码,看看它如何决定扩展什么,什么不扩展,但还没有得到一个机会
-
@TitianCernicova-Dragomir 我有好消息!你知道我是如何设法扩展映射类型的(如果 expand 意味着删除类型别名并显示为纯对象文字类型)?这个:
type Id<T>={} & { [P in keyof T] :T[P]}!诡异的!任何想法为什么会发生这种情况? :D
标签: typescript typescript-typings