用于功能参数解构的TSLint错误

时间:2019-05-22 22:58:42

标签: typescript parameter-passing tslint destructuring

我想消除我在以下内容(在对象解构参数中)遇到的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}行的任何答案吗?

1 个答案:

答案 0 :(得分: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

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(至少我没有找到删除它的方法-不是确定这是错误还是限制。

OmitExclude property from type