У меня возникла эта проблема с созданием объектов, соответствующих аннотации типа (Cards
в приведенном ниже примере), со свойством, имеющим тип различаемого объединения строковых литералов (CardType
в пример ниже), эти строковые литералы - это те же строковые литералы, что и в исходной аннотации типа.
// ------------ SETUP ------------
interface AboutCard {
type: 'About'
}
interface SplashCard {
type: 'Splash'
}
export type Cards = AboutCard | SplashCard
export type CardType = 'About' | 'Splash'
const type = 'About' as CardType
// ------------ SETUP END ------------
const example1: Cards = {
type
}
// ^
// Type 'CardType' is not assignable to type '"Splash"'.
// Type '"About"' is not assignable to type '"Splash"'.ts(2322)
const example2 = {
type
} as Cards
// ^ all good, no error.
const example3 = {
type: 'NOT_REAL_CARD'
} as Cards
// ^
// Types of property 'type' are incompatible.
// Type '"NOT_REAL_CARD"' is not comparable to type '"Splash"'.ts(2352)
В общем, мне интересно, почему этот первый пример:
const example1: Cards = {
type
}
терпит неудачу, но последние два примера делают то, что я ожидал.
example1
, кажется, соответствует типу Cards
, и если вы попытаетесь явно установить type
в строковый литерал About
или Splash
, он будет работать нормально, это просто когда он может быть распознаваемым объединением что у него есть проблемы.
Извините, я не знаю, как спросить это лучше!
Я чувствую, что, может быть, это так: Почему TypeScript преобразует строковый литерал в объединяющий тип строки при присваивании в литерал объекта? предлагает некоторые подсказки относительно того, почему это происходит?