// The way types defined:
interface SudoA {
foo: string;
}
interface SudoB {
bar: string;
}
type Sudo = SudoA | SudoB;
type SuperSudo = Sudo & {
super: boolean;
}
const baz: SuperSudo = {
}
// typescript (3.1.6) says i have to define both `bar` and `foo` for the object
我希望放置super
属性和其他属性(来自Sudo
类型)应该是可选的。问题;这是一个错误的期望吗?不管是或否,如何实现?
修改
更正了baz
的类型,这是我的错误:/。
我期望的是,SuperSudo
仅定义super
属性就足够了,而来自接口并集的其他属性应该是可选的。
我可以定义一个新类型,例如
type SuperSudo<T> = T & {}
,但最终使用了SuperSudo<T>
,我觉得它很冗长。
Edit2
更改标题
答案 0 :(得分:0)
您是否考虑过使用类型区分符?
如果没有一个,则同时指定foo
,bar
或foo
和bar
都将满足联合类型。
其中一个可能如下:
interface SudoA {
_type: "a";
foo: string;
}
interface SudoB {
_type: "b";
bar: string;
}
type Sudo = SudoA | SudoB;
type SuperSudo = Sudo & {
super: boolean;
}
const baz1_valid: SuperSudo = {
_type: "a",
super: true,
foo: "bar",
}
const baz2_valid: SuperSudo = {
_type: "b",
super: true,
bar: "foo",
}
字段名称不必为_type
,它必须是相同的字段名称,且每个变量的类型值不同。