typescript - Kan "inga okända egenskaper" upprätthållas med funktionstyper?
När vi definierar en funktions returtyp får vi ett typfel om vi inkluderar en egenskap i det returnerade objektet som inte finns i returtypen, vilket anger att objektsliteraler endast får ange kända egenskaper.
// Type '{ status: string; bar: string; }' is not assignable to type '{ status: string; }'.
// Object literal may only specify known properties, and 'bar' does not exist in type '{ status: string; }'.(2322)
const foo = function(): {status: string} {
return {
status: '200 OK',
bar: 'baz', // Problem
}
}
När vi definierar en funktionstyp kommer vi att få ett typefel när vi utelämnar en känd egenskap från det returnerade objektet, och det anges att den kända egenskapen saknas:
// Type '() => { baz: string; }' is not assignable to type '() => { status: string; }'.
// Property 'status' is missing in type '{ bar: string; }' but required in type '{ status: string; }'.(2322)
const foo: () => {status: string} = function () {
return {
// status: '200 OK'
bar: 'baz',
}
}
Men återigen, när man definierar en funktionstyp-vilket korrekt orsakar ett typfel för saknade egenskaper-kommer ett typfel inte att uppstå när man returnerar ett objekt som innehåller extra egenskaper:
const foo: () => {status: string} = function () {
return {
status: '200 OK',
bar: 'baz', // No problem
}
}
- Varför ger inte det sista exemplet ett typfel?
- Finns det något sätt att upprätthålla "inga extra egenskaper" på returobjektet när man använder en funktionstyp?
Se i lekplatsen
Svar #1
- Varför ger det sista exemplet inte ett typfel?
Eftersom funktionen inte deklarerar en returtyp, så härleds all typinformation om funktionen från funktionens definition. Det betyder att dess returtyp härleds från objektliteralen ({status: string, bar: string}). Den returtypen är i praktiken en subklass av returtypen för funktionen som variabeln förväntar sig, så tilldelningen är giltig.
- Finns det något sätt att tvinga fram "inga extra egenskaper" på returobjektet när man använder en funktionstyp?
Skriv själva funktionen, som det första blocket i din fråga, så att TypeScript vet att funktionen inte får lägga till bar. TypeScript kommer att härleda typen på variabeln från funktionen.
Om du vill skriva typen för variabeln uttryckligen istället för att låta Typescript härleda dess typ, kan du göra så här (playground-länk):
const foo2: () => {status: string} = function (): ReturnType<typeof foo2> {
return {
status: '200 OK',
bar: 'baz',
};
};
men din första kodblock är enklare.
