Проблема не связана с реакцией, она связана с тем, как Typescript выводит строковые литералы Typescript не будет выводить строковые литеральные типы, если у него нет причин для этого.
В этом случае initialFixtures
не печатается. Таким образом, у машинописного текста нет причины выводить name
как 'Liverpool' | 'Man Utd'
, поэтому он выводит его как string
. Когда вы позже попытаетесь присвоить initialFixtures
с его логическим типом Fixture[]
, назначение завершится неудачно (поскольку string
нельзя назначить Team
):
type Team = 'Liverpool' | 'Man Utd';
type Fixtures = {
teams: {
home: {
name: Team;
},
away: {
name: Team;
},
};
winner: Team;
};
const initialFixtures= [
{
teams: {
home: {
name: 'Liverpool',
},
away: {
name: 'Man Utd',
},
},
winner: 'Liverpool',
},
];
let o: Fixtures[] = initialFixtures; // error here
// Type '{ teams: { home: { name: string; }; away: { name: string; }; }; winner: string; }[]' is not assignable to type 'Fixtures[]'.
Простое решение - набрать initialFixtures
и не просить компилятор ничего выводить и просто проверять литерал объекта):
const initialFixtures: Fixtures[]= [
{
teams: {
home: {
name: 'Liverpool',
},
away: {
name: 'Man Utd',
},
},
winner: 'Liverpool',
},
];
let o: Fixtures[] = initialFixtures; //ok