TypeScript类型检查类型而不是实例(第2部分)

时间:2017-02-13 20:43:06

标签: typescript

第一部分提出了一个问题 - “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);

Playground

那么我如何使用构造函数覆盖维护类型检查?

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);
    }
}

1 个答案:

答案 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);
    }
}

您并不真正需要非实施签名,但我认为这使其更具可读性。