วิธีที่เหมาะสมประเภทดูรอบการบันทึกปล่อยให้บางส่วน subtrees กับ TypeScript?

0

คำถาม

กรุณามีจำนวนดูต่อไปนี้ทำเทปต่อดีกว่า.
interface Data บ่งบอกเป็นรูปแบบชุดสีสำหรับรอบการข้อมูล
function check จะต้องตรวจความถูกต้อไม่ว่าจะได้รับบางส่วน subtree นี้ Data โครงสร้างของไม่เป็นไรแล้วโยน compile เวลาเกิดข้อผิดพลาดถ้าไม่ได้(หวังว่าจะได้มาพร้อมกับเป็นมากกว่าหรือน้อยลงกล่องแสดงรายละเอียดแล้วเข้าใจได้ว่าข้อความผิดพลาดและไม่ใช่แค่"...ไม่ assignable ต้องประเภท'ไม่เคย").

interface Data {
  namespace1: {
    keyA: string,
    keyB: string
  },

  namespace2: {
    keyC: string,
    keyD: string
  }
}

// This function's only purpose is to perform a compile-time check
// whether the given partial data is valid.
// Returns the first and only argument in case of success,
// otherwise a compile-time error will occur.
function check<??>(
  partialData: ????
): ?????? {
  return partialData
}

// Example 1 => okay
const validPartialData1 = check({
  namespace1: {
    keyB: 'b'
  }
})

// Example 2 => okay
const validPartialData2 = check({
  namespace1: {
    keyB: 'b'
  },

  namespace2: {
    keyC: 'c'
  }
})

// Example 3 => okay
const validPartialData3 = check({})

// Example 4 => compile-time error!
const invalidPartialData1 = check({
  namespace1: {
    keyC: 'c'
  }
})

// Example 5 => compile-time error!
const invalidPartialData2 = check({
  xyz: {
    keyA: 'a'
  }
})
1

คำตอบที่ดีที่สุด

1

คุณไม่ต้องการ check ฟังก์ชัน. ใช้ตัวเลือกสนามโดยตรง

interface Data {
  namespace1?: {
    keyA?: string,
    keyB?: string
  },

  namespace2?: {
    keyC?: string,
    keyD?: string
  }
}

const validPartialData1:Data = {
  namespace1: {
    keyB: 'b'
  }
}

เห็น สนามเด็กเล่น

ถ้าคุณไม่อยากจะเปลี่ยน Data ประเภทนี้ได้นะ คุณสามารถกำหนดอื่น PartialData

type NestPartial<T> = {
    [P in keyof T]?: NestPartial<T[P]>;
}
type PartialData = NestPartial<Data>

const validPartialData1: PartialData = {
    namespace1: {
        keyB: 'b'
    }
}

เห็น สนามเด็กเล่น

2021-11-24 01:24:39

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่