有没有一种方法可以强制Set <T>构造函数的调用者提供类型参数?

时间:2020-11-10 18:19:27

标签: typescript

来自lib.es2015.collection.d.ts

interface SetConstructor {
    new <T = any>(values?: readonly T[] | null): Set<T>;
    readonly prototype: Set<any>;
}
declare var Set: SetConstructor;

TSet<T>的类型默认为any。但是,我想在我们的项目中强制执行Set构造函数的任何调用者都提供type参数。

所以

new Set<any>();

将是有效的,但

new Set();

将会是一个错误。

可以直接在TypeScript中实现吗?如果不是,是否有任何现有的构建时工具可用于相同目的?

1 个答案:

答案 0 :(得分:2)

您可以尝试下一个示例:

declare global {

    interface SetConstructor {
        new(): never; // thanks @jcalz for pointing this out
        new <T>(values?: readonly T[] | null): Set<T>;
        readonly prototype: Set<any>;
    }
    var Set: SetConstructor;
}

// no compile error
const set = new Set(); // never type
set // unable to call any method, because [set] has [never] type

没有编译错误,但是,您将无法调用[set]的任何方法。

在这里,TypeScript在我的示例中将[set]视为一个空值,没有属性和方法。