ข้อผิดพลาด 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