Typescript: tipe non-nullable tidak bermain bagus dengan opsional destructuring (ng2)

Dibuat pada 19 Mei 2016  ·  1Komentar  ·  Sumber: microsoft/TypeScript

Versi TypeScript:

nightly (1.9.0-dev. 20160217)

Kode

export interface QueryMetadataFactory {
    (selector: Type | string, {descendants, read}?: {
        descendants?: boolean;
        read?: any;
    }): ParameterDecorator;
    new (selector: Type | string, {descendants, read}?: {
        descendants?: boolean;
        read?: any;
    }): QueryMetadata;
}

Perilaku yang diharapkan:
Saat menyusun ini dengan pemeriksaan nol yang ketat, saya mengharapkan ini untuk dikompilasi, karena variabel yang dirusak telah ditandai sebagai opsional, karena ini berfungsi:

export interface QueryMetadataFactory {
    (selector: Type | string, whatever?: {
        descendants?: boolean;
        read?: any;
    }): ParameterDecorator;
    new (selector: Type | string, whatever?: {
        descendants?: boolean;
        read?: any;
    }): QueryMetadata;
}

Perilaku sebenarnya:
Saat kompilasi:

node_modules/@angular/core/src/metadata.d.ts(356,32): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'descendants' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(356,45): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'read' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(360,36): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'descendants' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(360,49): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'read' and no string index signatu
Bug

Komentar yang paling membantu

Yang ini garis batas. Fungsinya

function foo({ a, b }?: { a: number, b: number }) {
}

sebenarnya adalah kesalahan karena argumen yang Anda coba hancurkan mungkin undefined . Jadi, menerapkan tanda tangan persis seperti yang Anda miliki dalam contoh tidak akan mungkin dilakukan. Sekarang, jika Anda mengubah deklarasi menjadi

function foo({ a, b }: { a: number, b: number } = { a: 0, b: 0 }) {
}

itu bukan lagi kesalahan karena undefined akan diganti dengan nilai default. Namun, dari perspektif pemanggil, parameternya masih opsional dan jika Anda sekarang membuat file deklarasi, kami akan mengeluarkan deklarasi tersebut.

declare function foo({ a, b }?: { a: number, b: number }): void;

yang menyebabkan kesalahan. Dan _that_ adalah bug.

Sebagai tambahan, saya menyarankan untuk menghindari parameter penghancuran dalam tanda tangan non-implementasi. Mereka sebenarnya adalah detail implementasi, yaitu apakah implementasi fungsi merusak argumen atau hanya menggunakan akses properti seharusnya tidak terlalu mengkhawatirkan pemanggil. Namun, dalam kasus file deklarasi, karena kami tidak memiliki nama parameter aktual untuk dikeluarkan, kami (dengan enggan) memancarkan pola penghancuran sehingga kami perlu memperbaiki bug.

>Semua komentar

Yang ini garis batas. Fungsinya

function foo({ a, b }?: { a: number, b: number }) {
}

sebenarnya adalah kesalahan karena argumen yang Anda coba hancurkan mungkin undefined . Jadi, menerapkan tanda tangan persis seperti yang Anda miliki dalam contoh tidak akan mungkin dilakukan. Sekarang, jika Anda mengubah deklarasi menjadi

function foo({ a, b }: { a: number, b: number } = { a: 0, b: 0 }) {
}

itu bukan lagi kesalahan karena undefined akan diganti dengan nilai default. Namun, dari perspektif pemanggil, parameternya masih opsional dan jika Anda sekarang membuat file deklarasi, kami akan mengeluarkan deklarasi tersebut.

declare function foo({ a, b }?: { a: number, b: number }): void;

yang menyebabkan kesalahan. Dan _that_ adalah bug.

Sebagai tambahan, saya menyarankan untuk menghindari parameter penghancuran dalam tanda tangan non-implementasi. Mereka sebenarnya adalah detail implementasi, yaitu apakah implementasi fungsi merusak argumen atau hanya menggunakan akses properti seharusnya tidak terlalu mengkhawatirkan pemanggil. Namun, dalam kasus file deklarasi, karena kami tidak memiliki nama parameter aktual untuk dikeluarkan, kami (dengan enggan) memancarkan pola penghancuran sehingga kami perlu memperbaiki bug.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat