我有以下代码无法使用TypeScript编译器3.7.3
type Fruit = 'apple' | 'banana'
const val = 'apple'
// Works. TS remembers the value of `val`
const fruit: Fruit = val
type Basket = {
fruit: Fruit
}
const obj = {
fruit: 'apple'
}
// Error: Type 'string' is not assignable to type 'Fruit'.
// TS probably discarded that `fruit` property has concrete value and treats it as any `string`.
const structuralBasket: Basket = obj
// This works
const declaredBasket: Basket = {
fruit: 'apple'
}
我需要obj
保持原样。我不能做的事情和没有在答案中寻找的东西:
obj
声明为Basket
这是TypeScript编译器的限制吗?
如果是,是否有解决方法?将来会解决这个问题吗?
答案 0 :(得分:2)
问题在于,当您只声明obj
时,它的类型要比Fruit
大,所以您得到的是{fruit: string}
,这自然不能赋给它的子类型。您可以添加as const
const obj = {
fruit: 'apple'
} as const
这样的构造将被推断为{fruit: 'apple'}
,它已经可以分配给Basket
作为其子类型。
您还可以通过值构造函数创建此类对象。考虑:
const makeBasket = (fruit: Fruit): Basket => ({fruit})
const obj = makeBasket('apple'); // Basket object