typescript - วิธีสร้างชนิดโดยเลือกคีย์จากอ็อบเจ็กต์ที่มีค่า
ดังนั้นฉันมีวัตถุชิ้นใหญ่ชิ้นหนึ่ง
const bigObject = {
propA: "sup",
propB: "hi",
propC: undefined,
propD: "",
propE: "hello",
propF: null,
}
และฉันต้องการสร้างชนิดที่เป็นกุญแจของ bigObject ของฉัน แต่เฉพาะถ้ากุญแจนั้นมีค่า:
// what I have so far which doesn't quite work
type LittleObject = {
[x in keyof typeof bigObject]: number
}
↑↑↑↑ ประเภทนี้อนุญาตได้อิสระเกินไป มันกำหนดรูปร่างของอ็อบเจ็กต์ที่คีย์สามารถเป็นอะไรก็ได้ตั้งแต่ propA ถึง propF ฉันต้องการประเภทที่จะอนุญาตเฉพาะ propA, propB และ propE เท่านั้น เพราะพวกมันมีค่าที่เป็นจริง
คำตอบ #1
คุณสามารถใช้การแมปคีย์ใหม่เพื่อตรวจสอบแต่ละคีย์สำหรับประเภทที่คุณต้องการ จากนั้นตั้งค่าคีย์เป็น never ตามเงื่อนไขเพื่อเอาออกจากประเภทวัตถุที่ได้
const bigObject = {
propA: "sup",
propB: "hi",
propC: undefined,
propD: "",
propE: "hello",
propF: null,
} as const
// added as const so you can tell the difference so that
// "" does not get widened to string
type LittleObject = {
[
K in keyof typeof bigObject as
(typeof bigObject)[K] extends null | undefined | ""
? never
: K
]: number
}
สนามเด็กเล่น
ยอมรับว่ามันค่อนข้างแปลกอยู่เหมือนกัน ประเภทของพร็อพไม่น่าจะเป็นแค่ undefined ในการใช้งานจริง โดยปกติจะเป็น undefined | อะไรบางอย่าง ซึ่งหมายความว่าคุณน่าจะต้องการพร็อพนั้นเพื่อตรวจสอบมัน แต่ก็ยากที่จะให้คำแนะนำเฉพาะจากสิ่งที่คุณให้มาจนถึงตอนนี้ในคำถามของคุณ
