Reputation: 4419
The following code:
export type Partial2DPoint = { x: number } | { y: number }
export interface Partial3DPoint extends Partial2DPoint {
z: number
}
Fails with the following error:
An interface can only extend an object type or intersection of object types with statically known members.
Why is this happening?
Upvotes: 121
Views: 61766
Reputation: 4419
(I'm answering my own question) This is because you cannot extend a union type using an interface. You must use type alias:
export type Partial2DPoint = { x: number } | { y: number }
export type Partial3DPoint = Partial2DPoint & { z: number }
A class can implement an interface or type alias, both in the same exact way. Note however that a class and interface are considered static blueprints. Therefore, they can not implement / extend a type alias that names a union type.
Upvotes: 182