ตรวจสอบให้แน่ใจว่าอย่างน้อยหนึ่งสมาชิกของอินเทอร์เฟซไม่ใช่ค่า 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>
