在打字稿中定义类型的方式,例如[接口的联合之一]和{// atrributes}

时间:2018-11-21 00:17:55

标签: javascript typescript

// 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
更改标题

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用类型区分符?

如果没有一个,则同时指定foobarfoobar都将满足联合类型。

其中一个可能如下:

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,它必须是相同的字段名称,且每个变量的类型值不同。