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 🤔
}