Pesquisa de site

typescript - Existe uma maneira de forçar os chamadores do construtor Set<T> a fornecer um parâmetro de tipo?


De lib.es2015.collection.d.ts:

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

O tipo de T em Set<T> padrão para any. No entanto, eu gostaria de garantir em nosso projeto que qualquer chamador do construtor Set forneça o argumento de tipo.

Então

new Set<any>();

seria válido mas

new Set();

seria um erro.

Isso é possível diretamente em TypeScript? Se não, existe alguma ferramenta de tempo de compilação que possa ser usada para o mesmo propósito?

Resposta #1

Você pode tentar o próximo exemplo:

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

Não há erro de compilação, no entanto, você não poderá chamar nenhum método de [set].

Aqui, o TypeScript trata [set] no meu exemplo como um valor vazio, sem propriedades e métodos.