Kesalahan TSLint karena destrukturisasi parameter fungsi

Saya ingin menghapus kesalahan tslint yang saya dapatkan berikut ini (dalam parameter penghancuran objek):

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

Kesalahan yang saya dapatkan ada di baris 5:

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

tentu saja, saya dapat melakukan hal berikut, tetapi saya lebih suka melakukan apa yang memenuhi persyaratan pengetikan TypeScript.

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

Adakah jawaban tentang cara mengetik def baris {[oldProp]: old, ...others}?


person Kim Gentes    schedule 22.05.2019    source sumber


Jawaban (1)


Pertanyaan menarik, namun sepertinya belum ada jawaban pasti. Tapi ini salah satu upayanya:

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

Ini memiliki keuntungan, yaitu mengembalikan tipe yang tepat dengan oldProp terhapus dan newProp ditambahkan.

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"

* Sayangnya, TS tidak dapat menyimpulkan tipe yang tepat dari {[newProp]: value} dan tipe yang dihasilkan adalah { [x: string]: ... } jadi sayangnya as any diperlukan (setidaknya saya tidak menemukan cara untuk menghapusnya - tidak yakin apakah ini bug atau batasan).

Omit: Kecualikan properti dari tipe

person Zbigniew Zagórski    schedule 23.05.2019
comment
@Zbigiew Zagorski : Saya menggunakan Typscript versi 3.4.5, dan sesuai dengan tautan yang Anda berikan re: Abaikan, saya menambahkan baris berikut ke bagian atas file yang berisi fungsi tersebut. Apakah itu terdengar benar? -- type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; - person Kim Gentes; 23.05.2019
comment
@KimGentes: Ya, itulah yang saya maksud. Untuk beberapa alasan, Omit tidak disertakan dalam pustaka skrip ketikan, jadi setiap orang harus mengulanginya bila diperlukan. - person Zbigniew Zagórski; 23.05.2019
comment
TS 3.5 akhirnya akan memiliki Omit di perpustakaan standar: devblogs.microsoft.com/typescript/announcing-typescript-3-5/ - person Zbigniew Zagórski; 30.05.2019
comment
Terima kasih telah memberi tahu saya! - person Kim Gentes; 31.05.2019