是否可以有条件地要求 Typescript 接口中的属性

Ogu*_*oye 4 typescript

假设我有以下界面:

interface updateOptions {
  updateAll: boolean;
  fields: string[];
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以updateAll在未提供时进行要求Fields,反之亦然,或者这是在实施中必须有条件地完成的事情?

May*_*ius 6

使用标记的联合类型:

type UpdateOptions =
  | {updateAll: true}
  | {updateAll: false, fields: string[]}
Run Code Online (Sandbox Code Playgroud)

这样你只能初始化{updateAll: true}{updateAll: false, fields: ['someField', /*...*/]}

从技术上讲,联合不需要有标签( boolean updateAll),但是您需要定义类型保护来测试特定分支中使用的类型(我假设您将在代码中的某个位置执行此操作if (options.updateAll) {/* ... */}):

type UpdateAllOptions = {updateAll: true}
type UpdateSomeOptions = {fields: string[]}
type UpdateOptions = UpdateAllOptions | UpdateSomeOptions

// See https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards
const isAllOptions = (options: UpdateOptions): options is UpdateAllOptions =>
  (options as any).updateAll === true
Run Code Online (Sandbox Code Playgroud)