typescript - 打字稿:如何合并此交集的表示(在工具提示中)?
问题描述
我有一个重载的函数:
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
返回类型添加相互可选的属性。
任何类型的别名都不应添加到工具提示的输出中(除非这是解决此问题的唯一方法)。
漂亮很重要,因为它符合我的任务要求。
解决方案
我已经设法(在 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 引擎将映射类型视为值得命名的类型,如接口,而任何联合、交集(如上面的解决方案)或基本类型(如字符串文字)则不是。
推荐阅读
- linux - 通过特定网络接口路由 HTTP
- python - 如何让方法在类外查找类内部以进行范围界定
- python - 如何对时间实例进行分组、查找其持续时间并根据特定条件求和(在 R 或 Python 中)
- python - 如何从 python 中的网页获取 localStorage 属性?
- python - TextMate 2中的Python文本折叠不折叠列表/元组/字典
- database - 为什么在数据库中需要编码
- c# - ASP.Net Core MVC 在按下特定按钮时禁用验证
- google-cloud-platform - 为不同的时间间隔(小时和天)配置 cron 计划
- kotlin - Kotlin - 有没有办法将属性值传递给另一个具有同名属性的对象?
- android-studio - 从 Flutter 上的调试构建中排除资产