【发布时间】:2021-07-03 02:01:24
【问题描述】:
我正在尝试从工厂函数返回一个对象,并根据可区分的联合为其指定一个确切的类型。我在下面总结了一个非常简化的代码示例,但是当将鼠标悬停在 newSquare 对象上时表明编译器知道它是一个 Square,我在 return new Circle of 时遇到错误:
类型 'Circle' 不能分配给类型 'DiscriminateUnion
| DiscriminateUnion '。 类型 'Circle' 不可分配给类型 'DiscriminateUnion '。(2322)
谁能解释我做错了什么?非常感谢!
type ShapeKind = 'circle' | 'square'
class Circle{
kind: "circle" = 'circle';
radius: number;
constructor() {
this.radius = 4
}
}
class Square{
kind: "square" = 'square';
sideLength: number;
constructor() {
this.sideLength = 4
}
}
type Shape = Circle | Square;
type DiscriminateUnion<T, K extends keyof T, V extends T[K]> =
T extends Record<K, V> ? T : never
function makeShape<T extends ShapeKind>(shapeKind: T): DiscriminateUnion<Shape, 'kind', T> {
switch (shapeKind) {
case 'circle':
return new Circle()
case 'square':
return new Square()
default:
throw Error('not valid shape')
}
}
const newSquare = makeShape('square')
【问题讨论】:
标签: typescript factory typescript-generics return-type discriminated-union