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

javascript - Typescript การรวมวัตถุสองตัวด้วยตัวดำเนินการ spread และมีประเภทที่สามารถใช้งานซ้ำได้


หวังว่านี่จะเป็นคำถามที่ง่ายพอ แต่ฉันกำลังมีปัญหาในการหาวิธีการเขียนเป็นหัวข้อ ฉันกำลังสร้างฟังก์ชันที่ใช้ในการรับค่าและตั้งค่า และสำหรับการตั้งค่าค่านั้น โดยหลักๆ ฉันต้องเขียนประเภทเริ่มต้นใหม่แต่มีเครื่องหมายคำถามติดอยู่ข้างๆ เพราะฉันจะรวมตัวแปรปัจจุบันกับตัวแปรใหม่โดยอัตโนมัติ

มีวิธีที่ง่ายกว่านี้ที่ช่วยให้คุณเพิ่มเครื่องหมายคำถามแบบไดนามิกให้กับสิ่งนี้ได้ไหม หรือว่านี่คือวิธีที่ควรทำ? เพราะฉันต้องการให้ตัวแปรดั้งเดิมจำเป็นต้องมีในประเภท Vars

ดังนั้นตัวอย่างง่ายๆ เช่น:

interface Vars {
  a: number
  b: number
}

interface NewVars {
  a?: number
  b?: number
}

const createVars = () => {
  let vars: Vars = {
    a: 1,
    b: 2
  }

  const get = () => vars

  const set = (newVars: NewVars) => {
    vars = {
      ...vars,
      ...newVars
    }
  }

  return {
    get,
    set
  }
}

คำตอบ #1

คุณสามารถใช้ประเภทเครื่องมือ Partial ได้

interface NewVars extends Partial<Vars> {}

//Or

const set = (newVars: Partial<Vars>) => {...}

ดูสิ่งนี้บน TS Playground

ถ้าคุณต้องการเพิ่ม ? ให้กับค่าบางค่าเท่านั้น ให้ทำการตัดกันระหว่างส่วนย่อยของคีย์ที่เลือกได้กับคีย์ที่ต้องการ

type PickOptional<T extends Record<any, any>, Opt extends string> = Partial<Pick<T, Opt>> & Omit<T, Opt>

// or doing the inverse
type PickRequired<T extends Record<any, any>, Req extends string> = Required<Pick<T, Req>> & Omit<T, Req>

interface NewVars extends PickOptional<Vars, 'a'> {}