【问题标题】:TSLint error for destructuring in function parameters函数参数中解构的 TSLint 错误
【发布时间】:2019-05-23 08:05:22
【问题描述】:

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

【问题讨论】:

    标签: typescript parameter-passing tslint destructuring


    【解决方案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(至少我没有找到删除它的方法——不确定这是否是一个错误或限制)。

    Omit:Exclude property from type

    【讨论】:

    • @Zbigiew Zagorski :我使用的是 Typscript 版本 3.4.5,根据您提供的链接:省略,我在包含该函数的文件顶部添加了以下行。这听起来正确吗? -- type Omit&lt;T, K extends keyof T&gt; = Pick&lt;T, Exclude&lt;keyof T, K&gt;&gt;;
    • @KimGentes:是的,这正是我的意思。由于某种原因,Omit 没有包含在 typescript 库中,所以每个人都必须在需要时重复此操作。
    • TS 3.5 最终将在标准库中包含 Omit:devblogs.microsoft.com/typescript/announcing-typescript-3-5/…
    • 感谢您告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2014-07-06
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多