第一部分提出了一个问题 - “TypeScript是否有可能确保参数属于给定类型或其衍生物,而不是类型或其衍生物的实例?”
TypeScript type checking on type rather than instance
第一部分的解决方案是使用typeof
关键字
示例
function giveMeAType(type: typeof Foo): void {
}
或使用泛型
function giveMeAType<T extends typeof Foo>(type: T): void {
}
扩展此解决方案,当构造函数被引入派生类型时,我遇到了一个新问题
class Mangler<T> {
protected constructor(
public readonly item: T) {
}
public static getManglers(mangler: typeof Mangler): typeof Mangler[] {
var whatever = [];
return whatever;
}
}
class StringMangler extends Mangler<string> {
// No constructor override here...
}
class NumberMangler extends Mangler<number> {
// But in this case, I need one...
private constructor(
public readonly item: number) {
super(item);
}
}
// This one works while StringMangler does not override the constructor.
Mangler.getManglers(StringMangler);
// But when I override the constructor, it doesn't work.
Mangler.getManglers(NumberMangler);
那么我如何使用构造函数覆盖维护类型检查?
P.S。我希望派生类型能够拥有私有或受保护的构造函数!
更新1
详细说明Nitzan Tomer的答案,我可以创建构造函数protected
,但错误消失了,但我不能使构造函数变得多样......
class NumberMangler extends Mangler<number> {
// This polymorphic constructor doesn't work.
public constructor(
public readonly item: number,
public readonly name: string) {
super(item);
}
}
答案 0 :(得分:1)
如果您使NumberMangler.constructor
受到保护,那么错误就会消失:
class NumberMangler extends Mangler<number> {
protected constructor(
public readonly item: number) {
super(item);
}
}
这应该有效:
class NumberMangler extends Mangler<number> {
protected constructor(item: number);
protected constructor(item: number, name: string);
protected constructor(
public readonly item: number,
public readonly name?: string) {
super(item);
}
}
您并不真正需要非实施签名,但我认为这使其更具可读性。