在Typescript中键入可选的可调用装饰器

时间:2017-09-02 23:05:00

标签: javascript typescript decorator typescript-typings

我正在为一些js库编写打字稿类型。我需要声明可选的可调用装饰器:

@model
class User {}

@model()
class User {}

@model('User')
class User {}

我尝试使用ClassDecorator中的lib.es6.d.ts,但没有运气:

// works
export const model: ClassDecorator;

// error TS1238: Unable to resolve signature of class decorator when called as an expression. Cannot invoke an expression whose type lacks a call signature. Type 'ClassDecorator | CallableModelDecorator' has no compatible call signatures
type CallableModelDecorator = (name?: string) => ClassDecorator;
export const model: ClassDecorator | CallableModelDecorator;

当然,我可以将手动输入作为解决方法:

export function model<TFunction extends Function>(target: TFunction): TFunction | void;
export function model(name?: string):
  <TFunction extends Function>(target: TFunction) => TFunction | void;

但是如何在这种情况下重用现有的ClassDecorator类型?

1 个答案:

答案 0 :(得分:1)

问题是你使用的是union类型,这些类型的变量只有两种类型的公共成员,因此在这种情况下,因为只有一种类型是可调用的,所以union不可调用

您正在寻找一种交叉类型,它将具有两种类型

的成员
export const model: ClassDecorator & CallableModelDecorator;