复合类型中的TypeScript字符串联合类型推断问题

时间:2020-01-13 10:01:56

标签: typescript

我有以下代码无法使用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编译器的限制吗?

如果是,是否有解决方法?将来会解决这个问题吗?

1 个答案:

答案 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