在一个TypeScrip项目中,有这样一个类型定义:
type Foo = {
a: string;
b: string;
metadata: {
c: string;
d: string;
};
};
它是从其他地方进口的,在其他地方也用得很多,所以我不能改变它.
我想创建一个以Foo
为参数的函数,但a
和metadata.c
是可选的,因为我可以在此上下文中为这些字段设置有意义的默认值:
function doSomething(foo: {
a?: string;
b: string;
metadata: {
c?: string;
d: string;
};
}): void {
// do whatever
}
实际的类型要大得多,而且会不时更新,所以完全复制它的定义来添加两个问号不是一个 Select .
以下是我try 过的:
Foo & { a?: string; metadata: { c?: string } }
不起作用,因为这会同时创建一个Foo
和{ a?: string; metadata: { c?: string } }
的类型.这基本上只是Foo
,因为Foo
的所需属性"赢"了.如果我有逆问题(这里需要的Foo
中的可选属性),我可能会起作用.
Exclude<Foo, { a?: string; metadata: { c?: string } }>
不起作用,因为Foo
不是类型联合,而Exclude
只能从类型联合中排除类型.它不能从类型文字定义的类型中"减go "单个属性.
Partial<Foo>
使Foo
的所有属性均为可选.我不想这样.
Omit<Foo, 'a'> & { a?: string }
Omit
成功地将a
从Foo
中删除.然后,我可以将a
作为可选属性添加回来.然而,我不知道如何处理c
,因为它嵌套在metadata
中.
做这件事最好的办法是什么?