web-dev-qa-db-ja.com

Typescriptの定数から文字列リテラルの共用体型を定義する方法

文字列ユニオンタイプを定義して、変数を可能な文字列値の1つに制限できることを知っています。

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

私は定数文字列からそのようなタイプを構築する必要があります、例えば:

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

しかし、何らかの理由で機能しません。 MY_CONSTANT refers to a value, but it being used as a type here

TypeScriptが最初の例を許可するのに2番目の例を許可しないのはなぜですか? TypeScript 3.4.5を使用しています

10
Can Poyrazoğlu

@Titianの答えは正しくありません。 typeofは常にstringを返します。タイプの実際のチェックは行われません。

この場合はenumを使用することをお勧めします。例えば:

// 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'
}

列挙型の詳細

1
Eugene