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'> {}
