J'ai ce qui suit:

exampleFunction = (param: string) => {
  try {
    const result = processString(param) as { resultExample: string };
    
    return { isSuccess: true, ...result };
  catch (error) {
    return { isSuccess: false };
  }
}

Idéalement, le retour serait de type : { isSuccess: true, resultExample: string} | { isSuccess: false }, mais il serait de type { isSuccess: boolean, resultExample: string } | { isSuccess: boolean }, ce qui est frustrant car cela signifie que je ne peux pas utiliser les gardes de type.

const data = exampleFunction("exampleParam");

if (data.isSuccess) {
  functionExpectingResultExample(data.resultExample); // Type Error because "resultExample: string | {}" is not assignable to "resultExample: string"
}

Ce qui précède ne doit pas contenir d'erreur, car les valeurs true et false doivent être utilisées en tant que gardes de type, mais elles sont plutôt saisies en tant que booléens.

Ma seule solution est-elle de les saisir manuellement comme vrai et faux ?

3
David 14 sept. 2020 à 09:49

1 réponse

Meilleure réponse

Vous devez convertir le type de retour isSuccess en const, afin que TypeScript sache que la valeur n'est pas booléenne, mais d'une valeur booléenne spécifique et immuable :

const exampleFunction = (param: string) => {
  try {
    const result = processString(param) as { resultExample: string };
    
    return { isSuccess: true as const, ...result };
  } catch (error) {
    return { isSuccess: false as const };
  }
}

Consultez le preuve de concept sur tapuscrit Plaine de jeux .


Vous pouvez également convertir l'intégralité de l'objet renvoyé en const, si vous le souhaitez :

const exampleFunction = (param: string) => {
  try {
    const result = processString(param) as { resultExample: string };
    
    return { isSuccess: true , ...result } as const;
  } catch (error) {
    return { isSuccess: false } as const;
  }
}

Voir la deuxième preuve de concept ici.

3
Terry 14 sept. 2020 à 06:56