Pesquisa de site

typescript - Erro do TSLint para desestruturação em parâmetros de função


Eu gostaria de remover o erro do tslint que recebo no seguinte (no parâmetro de desestruturação do objeto):

export function renameProperty(
    oldProp: string,
    newProp: string,
    {[oldProp]: old, ...others}
): any {
    return {
        [newProp]: old,
        ...others
    };
}

O erro que recebo está na linha 5:

TSLint: expected parameter: '{[oldProp]: old, ...others}' to have a typedef (typedef)

claro, eu poderia fazer o seguinte, mas eu preferiria simplesmente fazer o que satisfaz os requisitos de tipagem do Typescript.

export function renameProperty(
    oldProp: string,
    newProp: string,
    // tslint:disable-next-line:typedef
    {[oldProp]: old, ...others}
): any {
    return {
        [newProp]: old,
        ...others
    };
}

Alguma resposta sobre como digitar def a linha {[oldProp]: old, ...others}?

Resposta #1

Pergunta interessante, mas parece que não há uma resposta definitiva. Mas aqui está uma tentativa:

export function renameProperty<
    T extends {},
    OP extends keyof T,
    NP extends string,
    R = Omit<T, OP> & Record<NP, T[OP]>
>(oldProp: OP, newProp: NP, { [oldProp]: value, ...others }: T): R {
    return {
        [newProp]: value,
        ...others
    } as any; // *
}

Isso tem a vantagem de que retorna o tipo adequado com oldProp apagado e newProp adicionado.

ou seja

const c = renameProperty("foo", "bar", { foo: 1, baz: "spam", holy: "grenade" });
console.log(c.foo, c.bar, c.baz, c.holy);
    /// complains here, that 'foo' is not available in c
    /// typeof c.bar === "number"

* Infelizmente, o TS não consegue inferir o tipo correto a partir de {[newProp]: value} e o tipo resultante é { [x: string]: ... }, então, infelizmente, o terrível as any é necessário (pelo menos eu não encontrei uma maneira de removê-lo - não tenho certeza se isso é um bug ou uma limitação).

Omit: Excluir propriedade do tipo