javascript - Typescript slår sammen to objekter med spread-operatoren og har en gjenbrukbar type
Forhåpentligvis er dette et enkelt nok spørsmål, men jeg har problemer med å finne ut hvordan jeg skal formulere det i tittelen. Jeg laget en funksjon som henter og setter en verdi. Og for å sette verdien må jeg i utgangspunktet skrive om den opprinnelige typen, men med et spørsmålstegn ved siden av, fordi jeg automatisk vil slå sammen de nåværende variablene med de nye.
Finnes det en enklere tilnærming som lar deg dynamisk legge til spørsmålstegnet her, eller er dette måten å gjøre det på? For jeg vil at de opprinnelige variablene skal være påkrevd i Vars-typen.
Så et enkelt eksempel som:
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
}
}
Svar #1
Du kan bruke Partial-verktøytypen
interface NewVars extends Partial<Vars> {}
//Or
const set = (newVars: Partial<Vars>) => {...}
Se dette på TS Playground
Hvis du bare vil legge til ? til visse verdier, kryss bare delmengden av de valgfrie nøklene og påkrevde nøklene.
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'> {}
