Perché i seguenti lavori asserzione:Perché dattiloscritto affermazione letterale oggetto `{a}` opera con interfaccia `{a, b}` ma non `{a} ?, b`
interface AllRequired {
a: string;
b: string;
}
let all = {a: "foo"} as AllRequired; // No error
Ma questa affermazione dà un errore:
interface SomeOptional {
a?: string;
b: string;
}
let some = {a: "foo"} as SomeOptional; // Error: Property 'b' missing
L'unica differenza che posso vedere è fare una delle proprietà di interfaccia opzionali (?
). Sembra che se tutte le proprietà non sono opzionali, posso affermare un oggetto parziale all'interfaccia, ma non appena una qualsiasi delle proprietà dell'interfaccia è opzionale, non posso più affermare un oggetto parziale. Questo non ha davvero senso per me e non sono stato in grado di trovare una spiegazione di questo comportamento. Cosa sta succedendo qui?
per il contesto: ho encountered this behavior durante il tentativo di aggirare il problema che reagiscono di setState()
prende un oggetto di stato parziale, ma TypeScript doesn't yet have partial types per fare questo lavoro correttamente con l'interfaccia dello stato. Come soluzione alternativa, ho trovato il codice setState({a: "a"} as MyState)
e ho trovato che funziona finché i campi dell'interfaccia MyState
sono tutti non facoltativi, ma non riescono appena alcune proprietà sono facoltative. (Rendere tutte le proprietà facoltative è una soluzione, ma molto indesiderabile nel mio caso.)
ad essere sincero, credo che ci sia solo una persona su StackOverflow in grado di rispondere a quella qu estion e questo è @RyanCavanaugh (si spera che lo convochi). Altrimenti potrebbe esserci un problema nella pagina github di TypeScript. – toskv