web-dev-qa-db-fra.com

Comment définir le type d'union littérale de chaîne à partir de constantes dans Typescript

Je sais que je peux définir des types d'union de chaîne pour restreindre les variables à l'une des valeurs de chaîne possibles:

type MyType = 'first' | 'second'
let myVar:MyType = 'first'

J'ai besoin de construire un type comme ça à partir de chaînes constantes, par exemple:

const MY_CONSTANT = 'MY_CONSTANT'
const SOMETHING_ELSE = 'SOMETHING_ELSE'
type MyType = MY_CONSTANT | SOMETHING_ELSE

Mais pour une raison quelconque, cela ne fonctionne pas; ça dit MY_CONSTANT refers to a value, but it being used as a type here.

Pourquoi TypeScript autorise le premier exemple, mais n'autorise pas le second cas? Je suis sur TypeScript 3.4.5

10
Can Poyrazoğlu

@ La réponse de Titian n'est pas correcte. typeof renverra toujours un string. Il n'y aura pas de véritable vérification de type.

Je propose d'utiliser enum pour ce cas. Par exemple:

// Define enum.
enum myConstants {
  MY_CONSTANT = 'my_constant',
  SMTH_ELSE = 'smth_else'
}

// Use it in an interface for typechecking.
interface MyInterface {
  myProp: myConstants
}

// Example of correct object - no errors.
let a: MyInterface = {
  myProp: myConstants.MY_CONSTANT
}

// Incorrect value - TS reports an error.
let b: MyInterface = {
  myProp: 'John Doe'
}

En savoir plus sur les énumérations

1
Eugene