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

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 | อะไรบางอย่าง ซึ่งหมายความว่าคุณน่าจะต้องการพร็อพนั้นเพื่อตรวจสอบมัน แต่ก็ยากที่จะให้คำแนะนำเฉพาะจากสิ่งที่คุณให้มาจนถึงตอนนี้ในคำถามของคุณ