【发布时间】:2019-09-02 21:39:55
【问题描述】:
我正在编写一个新的 TypeScript 类,它采用一个通用值,该值将用作函数的输入。如果未给出值,则该函数不应接受任何输入。
理想情况下,类会像这样被重载。
class Emitter<T = void> {
public activate(): void // When T is void
public activate(arg: T): void // When T isn't void
public activate(arg?: T) { /* ... */ }
}
让方法成为函数属性在理论上可行,但在方法的实现上需要@ts-ignore。
type OneArgFn<T> = T extends void
? () => void
: (arg: T) => void
interface Emitter<T> {
readonly activate: OneArgFn<T>
}
另一种可能性是在提供或不提供泛型时导出不同的构造函数,例如以下
interface EmitterNoArg extends Emitter {
activate: () => true
}
interface EmitterOneArg<T> extends Emitter<T> {
activate: (arg: T) => void
}
interface EmitterConstructor {
new(): Emitter
new(): EmitterNoArg
new<T>(): EmitterOneArg<T>
}
但是要导出它,unknown 关键字是必需的。
export default Emitter as unknown as EmitterConstructor
这些,似乎不是最佳的。有没有一种合适的方法可以根据泛型的类型来获得条件参数?我认为 TypeScript 的新 conditional types 可以解决这个问题。
【问题讨论】:
标签: typescript typescript-typings