typescript - Varför beter sig gränssnitt med endast en egenskap annorlunda än de med flera egenskaper?
Jag har precis börjat med TypeScript och har stött på något förvirrande beteende. Om jag har ett interface MyInterface med flera egenskaper och en key: keyof MyInterface, kan jag skapa en ny instans av interfacet med ett godtyckligt värde för key-egenskapen. Tänk på följande:
interface Values {
one: 1;
two: 2;
}
function getNewVals(vals: Values, key: keyof Values): Values {
// aValue: 1 | 2, so clearly typescript knows the union of possible values
const aValue = vals[key];
// but this is not an error
return { ...vals, [key]: "foo" };
// I can do this, too
const another: Values = { one: 1, two: 2, [key]: "foo" };
// however, this is an error as expected, since 2 isn't assignable to the one
// property
vals[key] = 2;
}
Å andra sidan, om mitt gränssnitt bara har en egenskap, fångas felet:
interface JustOneValue {
one: 1;
}
function getNewJustOneVal(
vals: JustOneValue,
key: keyof JustOneValue
): JustOneValue {
// this is fine now as expected
vals[key] = 1;
// but the following are both errors:
// "Type of computed property's value is 'string', which is not assignable to type '1'"
return { ...vals, [key]: "foo" };
// "Type of computed property's value is '2', which is not assignable to type '1'"
return { ...vals, [key]: 2 };
}
Vad pågår här? Å ena sidan skulle jag vilja kunna säga något som return { ...vals, [key]: (value in union of property types) };, även om jag inte är säker på att jag borde kunna det (förutsatt att egenskapstyperna inte är identiska), eftersom jag inte vet vilken key det är. Men det faktum att jag kan tilldela vad som helst till key verkar fel. Har jag hittat en bugg, eller går detta att förklara?
Svar #1
Detta verkar trots allt vara en bugg. Jag har lämnat in ett ärende för att åtgärda det, vilket sedan har markerats som en duplicering av ett annat ärende från 2017. Anledningarna till varför är inte helt klara, men buggen verkar vara omöjlig att åtgärda för tillfället.