Typescript:需要至少一个属性的类型

Trí*_*han 8 javascript typescript

考虑我有以下类型:

type SomeType = {
  propOne: any;
  propTwo: any;
  propThree: any;
}
Run Code Online (Sandbox Code Playgroud)

propOne必需的,propTwo并且propThree是可选的,但至少其中之一是必需的。如何定义具有该约束的类型?

// The following code is my expectation
let someVar1: SomeType = { propOne: 1, propTwo: "two" } //Okay
let someVar2: SomeType = { propOne: 1, propThree: "three" } //Okay
let someVar3: SomeType = { propOne: 1, propTwo: "two", propThree: "three" } //Okay
let someVar4: SomeType = { propOne: 1 } //Not Okay
Run Code Online (Sandbox Code Playgroud)

art*_*pse 15

You can use the same trick even after your edit:

type SomeType = {
  propOne: number;
  propTwo?: string;
  propThree?: string;
} & ({
  propTwo: string;
} | {
  propThree: string;
})

let someVar1: SomeType = { propOne: 1, propTwo: "two" } //Okay
let someVar2: SomeType = { propOne: 1, propThree: "three" } //Okay
let someVar3: SomeType = { propOne: 1, propTwo: "two", propThree: "three" } //Okay
let someVar4: SomeType = { propOne: 1 } //Not Okay

function f(s: SomeType) {
  let p1 = s.propOne; // number
  let p2 = s.propTwo; // string | undefined
  let p3 = s.propThree; // string | undefined
}
Run Code Online (Sandbox Code Playgroud)

It forces you to have at least one property at declaration time, and it allows you to use both properties of the type when using objects of that type.

Playground