javascript - Standardparametern bryter den automatiska TypeScript-typvalet
När jag ger en funktion ett standardvärde beter sig typerna på ett otydligt sätt.
type TRadio = {
type: 'RADIO'
value: string
}
type TChecks = {
type: 'CHECK'
value: string[]
}
type TGroup = TRadio | TChecks
const testFunc = ({ type, value }: TGroup) => {
if (type === 'CHECK') value // string[] 👍
if (type === 'RADIO') value // string 👍
}
const testFunc2 = ({ type = 'RADIO', value }: TGroup) => {
if (type === 'CHECK') value // string | string[] 🤔
if (type === 'RADIO') value // string | string[] 🤔
}
Varför bryter testFunc2 med typen='RADIO' typen av "value"?
Jag förväntade mig att standardvärdet inte skulle förändra typvalslogiken och att funktionerna skulle fungera på samma sätt
Svar #1
Det verkar som att TS behåller korrelationen mellan destrukturerade variabler tills de förändras. Att tilldela ett standardvärde behandlas som en potentiell förändring, så korrelationen bryts.
Förresten, ditt standardvärde är inte meningsfullt eftersom typ är obligatorisk. Så gör det valfritt endast för radioknappen.
Så du antingen muterar inte eller muterar innan destrukturering:
Lekplats
type TRadio = {
type?: 'RADIO'
value: string
}
type TChecks = {
type: 'CHECK'
value: string[]
}
type TGroup = TRadio | TChecks
const testFunc2 = ({ type, value }: TGroup) => {
if (type === 'CHECK') value // string[] 🤔
if (!type || type === 'RADIO') value // string 🤔
}
const testFunc3 = (group: TGroup) => {
group.type ??= 'RADIO';
const {type, value} = group;
if (type === 'CHECK') value // string[] 🤔
if (type === 'RADIO') value // string 🤔
}
