网站搜索

typescript - 函数参数的解构在 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
    };
}

有谁知道如何输入这行代码 {[oldProp]: old, ...others} 吗?

答案#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(至少我没找到去掉它的方法——不确定这是一个 bug 还是限制)。

Omit:从类型中排除属性