Типы литералов в издевательском json

#javascript #json #typescript #types

Вопрос:

Итак, у меня есть этот JSON:

 {
  "elements": [
    {
      "type": "abstract"
    },
    {
      "type": "machine"
    },
    {
      "type": "user"
    }
  ]
}
 

И вот мои типы:

 export type StateStructure = {
  type: 'user' | 'machine' | 'abstract';
};
 

Но когда я пытаюсь импортировать JSON в качестве данных и установить его в этот тип, вот так:

 export const constructStatesTreeStructure = (
  data: StatesRootData = states,
) => ...
 

Я получаю эту ошибку:

 Types of property 'type' are incompatible.
          Type 'string' is not assignable to type '"abstract" | "user" | "machine"'.
 

Что имеет смысл. TS не знает, что все значения в type поле JSON на самом деле являются одним из этих 3. Но как я могу «привести» его или «сказать» TS, что это единственные 3 значения, возможные в этом JSON?

Я пытался сделать что-то вроде

type: string amp; ('user' | 'machine' | 'abstract')

но не повезло.

Ответ №1:

Не бери в голову, это все решило:

 export const constructStatesTreeStructure = (
  data: StatesRootData = states as StatesRootData,
) => ...