typescript - Instanceof-typvakt kan inte begränsa typen av en variabel som används inuti en callback
const userAPI = {
async getById() { }
}
const batchedUpdates = (callback: () => any) => {
callback();
}
const setError = (error: Error | null) => { }
async function main() {
const result: { error: Error | null, data: any | null } = {
error: null,
data: null
}
try {
const user = await userAPI.getById();
} catch (error) {
if (error instanceof Error) {
result.error = error;
batchedUpdates(() => {
setError(error);
})
}
}
}
Fick fel på raden med setError(error)-satsen:
Argument av typen 'unknown' kan inte tilldelas parametern av typen 'Error | null'.(2345)
Jag vill inte upprepa instanceof-typkontrollen i callbacken för batchedUpdates, vad är rätt sätt att hantera denna situation? Tack.
TypeScript-lekplats
Svar #1
Kontrollflödesanalys korsar inte callback-gränser. Detta förklaras i den kanoniska frågan Trade-offs in Control Flow Analysis
En lösning är att använda en lokal variabel för att frysa typen:
const userAPI = {
async getById() { }
}
const batchedUpdates = (callback: () => any) => {
callback();
}
const setError = (error: Error | null) => { }
async function main() {
const result: { error: Error | null, data: any | null } = {
error: null,
data: null
}
try {
const user = await userAPI.getById();
} catch (error) {
if (error instanceof Error) {
result.error = error;
const localError = error
batchedUpdates(() => {
setError(localError);
})
}
}
}
Lekplatslänk
