Por que a asserção TypeScript do objeto literal `{a}` funciona com a interface `{a, b}` mas não `{a ?, b}`
Por que a seguinte afirmação funciona:
interface AllRequired {
a: string;
b: string;
}
let all = {a: "foo"} as AllRequired; // No error
Mas essa afirmação dá um erro:
interface SomeOptional {
a?: string;
b: string;
}
let some = {a: "foo"} as SomeOptional; // Error: Property 'b' missing
A única diferença que vejo é tornar opcional uma das propriedades da interface (?
) Parece que, se todas as propriedades não são opcionais, posso afirmar um objeto parcial para a interface, mas, assim que qualquer uma das propriedades da interface for opcional, não posso mais afirmar um objeto parcial. Isso realmente não faz sentido para mim e não consegui encontrar uma explicação para esse comportamento. Oque esta acontecendo aqui?
Por contexto: Iencontrou esse comportamento enquanto tenta contornar o problema que o ReactsetState()
pega um objeto de estado parcial, masO TypeScript ainda não possui tipos parciais para fazer isso funcionar corretamente com sua interface de estado. Como solução alternativa, eu vim comsetState({a: "a"} as MyState)
e descobri que isso funciona desde que a interfaceMyState
campos sãotudo não opcional, mas falha assim quealguns propriedades são opcionais. (Tornar todas as propriedades opcionais é uma solução alternativa, mas muito indesejável no meu caso.)