Warum funktioniert die TypeScript-Zusicherung des Objektliterales "{a}" mit der Schnittstelle "{a, b}", aber nicht "{a ?, b}"

Warum funktioniert die folgende Behauptung:

interface AllRequired {
    a: string;
    b: string;
}

let all = {a: "foo"} as AllRequired; // No error

Aber diese Behauptung gibt einen Fehler:

interface SomeOptional {
    a?: string;
    b: string;
}

let some = {a: "foo"} as SomeOptional; // Error: Property 'b' missing

Der einzige Unterschied, den ich sehen kann, besteht darin, eine der Interface-Eigenschaften optional zu machen ?). Wenn nicht alle Eigenschaften optional sind, kann ich der Schnittstelle ein Teilobjekt zuweisen. Sobald jedoch eine der Eigenschaften der Schnittstelle optional ist, kann ich kein Teilobjekt mehr zuweisen. Das ergibt für mich keinen Sinn und ich konnte keine Erklärung für dieses Verhalten finden. Was ist denn hier los

Für Kontext: Ichauf dieses Verhalten gestoßen beim Versuch, das Problem zu umgehen, dass React'ssetState() nimmt ein Teilstatusobjekt an, aberTypeScript hat noch keine Teiltypen, damit dies mit Ihrer Statusschnittstelle ordnungsgemäß funktioniert. Als Workaround habe ich mir @ ausgedacsetState({a: "a"} as MyState) und festgestellt, dass dies funktioniert, solange interfaceMyState Felder sindall nicht optional, schlägt aber fehl, sobaldetwa Eigenschaften sind optional. (Alle Eigenschaften optional zu machen ist eine Problemumgehung, aber in meinem Fall sehr unerwünscht.)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage