Ошибка TSLint для деструктуризации в параметрах функции

Я хотел бы удалить ошибку tslint, которую я получаю при следующем (в параметре разрушения объекта):

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

Ошибка, которую я получаю, находится в строке 5:

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

конечно, я мог бы сделать следующее, но я бы предпочел просто сделать то, что удовлетворяет требованиям ввода Typescript.

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

Любые ответы о том, как ввести def строку {[oldProp]: old, ...others}?


person Kim Gentes    schedule 22.05.2019    source источник


Ответы (1)


Интересный вопрос, но похоже, что на него нет однозначного ответа. Но вот одна попытка:

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; // *
}

У этого есть преимущество, которое возвращает правильный тип со стертым oldProp и добавленным newProp.

i.e

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"

* К сожалению, TS не может вывести правильный тип из {[newProp]: value}, и результирующий тип { [x: string]: ... }, поэтому, к сожалению, необходим ужасный as any (по крайней мере, я не нашел способа его удалить - не уверен, что это ошибка или ограничение).

Omit: Исключить свойство из типа

person Zbigniew Zagórski    schedule 23.05.2019
comment
@Zbigiew Zagorski: я использую Typscript версии 3.4.5, и, согласно предоставленной вами ссылке: Опустить, я добавил следующую строку в начало файла, содержащего функцию. Это звучит правильно? -- type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; - person Kim Gentes; 23.05.2019
comment
@KimGentes: Да, именно это я и имел в виду. По какой-то причине Omit не включен в библиотеку typescript, поэтому всем приходится повторять это при необходимости. - person Zbigniew Zagórski; 23.05.2019
comment
В стандартной библиотеке TS 3.5 наконец-то появится Omit: devblogs.microsoft.com/typescript/announcing-typescript-3-5/ - person Zbigniew Zagórski; 30.05.2019
comment
Спасибо, что дали мне знать! - person Kim Gentes; 31.05.2019