ค้นหาเว็บไซต์

ตรวจสอบให้แน่ใจว่าอย่างน้อยหนึ่งสมาชิกของอินเทอร์เฟซไม่ใช่ค่า null ใน TypeScript


สมมติว่าฉันมีอินเทอร์เฟซ TypeScript:

interface MyInputInterface {
  a: A | null
  b: B | null
  aString: string | null
}

นี่คือสิ่งที่ฉันมีอยู่ในปัจจุบัน:

const hasOneNonNull = (input: MyInputInterface) => 
  input.a !== null || input.b !== null || input.aString !== null

แต่นี่ดูเปราะบางมาก ฉันต้องจำที่จะอัปเดตการตรวจสอบทุกครั้งที่ฉันเพิ่มสมาชิกอินเทอร์เฟซใหม่ มีวิธีในการวนซ้ำผ่านสมาชิกทุกตัวของอินเทอร์เฟซและตรวจสอบว่ามีอย่างน้อยหนึ่งตัวที่ไม่เป็นค่า null ไหม?

บางอย่างแบบนี้จะเหมาะสมมากกว่า (getAllMembers เป็นโค้ดตัวอย่าง):

const hasOneNonNull = (input: MyInputInterface) => 
  input.getAllMembers().find((elem: any) => any !== null) !== null

คำตอบ #1

คุณกำลังมองหา Object.values:

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

คุณยังสามารถใช้ประเภทยูเนียนเพื่อระบุได้ว่าคุณต้องการอย่างน้อย a หรือ b:

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; }

ประเภทยังสามารถระบุได้โดยใช้ประเภทแมปของ 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>