typescript - Typescript中的对象休息之类的东西?类似于部分
问题描述
这是一个简单的示例代码:
interface Params {
a: string
b: number
c: boolean
}
const f1 = (p1: Params) => void;
const f2 = (p2: Params2) => f1({a: 'default', ...p2});
f2
填充Params.a
默认值。因此,Params2
is Params
with a?: string
(a
是可选的)。
如何在Params2
不手动列出的情况下创建它a
,,?b
c
我尝试了以下方法,但它不起作用:
interface Params2 extends Params {
a?: string
}
使用Partial<T>
是不好的,因为它使所有属性都是可选的,而不是只是a
可选的。
解决方案
使用条件类型(特别是Exclude
)和映射类型(特别是Pick
and Partial
),您可以表达采用现有类型并有选择地将其某些属性转换为可选属性的想法:
type Optionalize<T, K extends keyof T> =
Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>
这基本上是说,Optionalize<T, K>
当您取出带有键的属性K
并将它们设为可选时,您会得到什么,而其余所有属性都保持原样。
interface Params2 extends Optionalize<Params, 'a'> {}
您可以验证这Params2
相当于
{a?: string, b: number, c: boolean}
如预期的。
一个不同的想法:你Params
实际上比你更窄Params2
,虽然你不能通过 extends 得到Params2
,Params
你可以做相反的事情:
interface Params2 {
a?: string
b: number
c: boolean
}
interface Params extends Params2 {
a: string
}
这可能适合您,也可能不适合您,但它可能比Optionalize
上面的类型杂耍更直接。
希望有帮助;祝你好运!
推荐阅读
- javascript - 节点js将html变量写入玉模板
- matlab - 我的 DBSCAN 算法出错。Matlab版本
- swift - 在 Swift 中删除 UIScollView 顶部的空间
- cassandra-3.0 - 行键/分区和节点位置
- dart - 如何将 X 类型的 Iterable 转换为 Y 类型 Re: Iterable
可迭代 - jquery - Jquery $.get 变量不起作用
- swift - 如何使用firebase重新验证用户
- keras - 如何在keras中向中间层提供输入
- phonegap - 何时使用 onTokenRefresh?
- django - 在 django 中调试测试时检查数据库