检查打字稿中至少有一个接口成员为非空

Arn*_*tta 2 typescript

假设我有一个打字稿界面:

\n\n
interface MyInputInterface {\n  a: A | null\n  b: B |\xc2\xa0null\n  aString: string | null\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是我目前所拥有的:

\n\n
const hasOneNonNull = (input: MyInputInterface) => \n  input.a !== null || input.b !== null ||\xc2\xa0input.aString !== null\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这看起来很脆弱。每次添加新的接口成员时,我都必须记住更新检查。有没有一种方法可以遍历所有接口成员并检查其中至少一个不为空?

\n\n

像这样的东西会更理想(getAllMembers是伪代码):

\n\n
const hasOneNonNull = (input: MyInputInterface) => \n  input.getAllMembers().find((elem: any) => any !== null) !== null\n
Run Code Online (Sandbox Code Playgroud)\n

DaG*_*ner 5

您正在寻找Object.values

const hasOneNonNull = (input: MyInputInterface) =>
  Object.values(input).reduce((hasNonNull, value) => hasNonNull|| value !== null, false);
Run Code Online (Sandbox Code Playgroud)

您还可以利用联合类型来指定您至少需要ab

type MyInputInterface =
  | { a: A; b: B | null; aString: string | null; }
  | { a: A | null; b: B; aString: string | null; }
  | { a: A | null; b: B | null; aString: string; }
Run Code Online (Sandbox Code Playgroud)

还可以使用 Typescript 的映射类型来指定类型:

以下内容摘自此SO答案:

interface FullMyInputInterface {
  a: A;
  b: B;
  aString: string;
}

type AtLeastOne<T, U = {[K in keyof T]: Pick<T, K> }> = Partial<T> & U[keyof U]

type MyInputInterface = AtLeastOne<FullMyInputInterface>
Run Code Online (Sandbox Code Playgroud)