Tslint: predikat tipe-ketat: Positif palsu dengan tipe indeks

Dibuat pada 22 Jun 2017  ·  3Komentar  ·  Sumber: palantir/tslint

Laporan Bug

  • __TSLint versi__: 5.4.3 5cf7100ad3c7b2fd3be62d94b7b4708460590a97
  • __TypeScript versi__: 2.4.0
  • __Menjalankan TSLint melalui__: CLI

Terkait dengan: https://github.com/Microsoft/TypeScript/issues/13778

Kode TypeScript sedang dilinting

declare function get<T>(): T;
// index types
{
    get<{ [key: string]: string }>()['foo'] === undefined
    get<{ [key: string]: string }>()['foo'] === null
    get<{ [key: string]: string }>()['foo'] == undefined
    get<{ [key: string]: string }>()['foo'] == null

    get<{ [index: number]: string }>()[0] === undefined
    get<{ [index: number]: string }>()[0] === null
    get<{ [index: number]: string }>()[0] == undefined
    get<{ [index: number]: string }>()[0] == null
}

dengan konfigurasi tslint.json :

(Menggunakan test/rules/strict-type-predicates/strict-null-checks/tsconfig.json )

Perilaku aktual / yang diharapkan

(A adalah Aktual, E diharapkan, B adalah Keduanya)

{
    get<{ [key: string]: string }>()['foo'] === undefined
A:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
    get<{ [key: string]: string }>()['foo'] === null
B:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
    get<{ [key: string]: string }>()['foo'] == undefined
A:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
E:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Use '=== undefined' instead.]
    get<{ [key: string]: string }>()['foo'] == null
A:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
E:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Use '=== undefined' instead.]

    get<{ [index: number]: string }>()[0] === undefined
A:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
    get<{ [index: number]: string }>()[0] === null
B:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
    get<{ [index: number]: string }>()[0] == undefined
A:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
E:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Use '=== undefined' instead.]
    get<{ [index: number]: string }>()[0] == null
A:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Expression is always false.]
E:  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Use '=== undefined' instead.]
}

(Contoh yang berjalan ada di sini: https://github.com/ypresto/tslint/tree/strict-type-predicates-index-type )

External

Komentar yang paling membantu

Contoh yang lebih sederhana:

const foo: { [key: string]: string } = {}
if (foo.bar === undefined) {
    // blah
}

akan menghasilkan

ERROR: /Users/yuya/repo/github.com-private/codetakt/pf-user-admin/client/test.ts[2, 5]: Expression is always false.

tetapi tidak ada kesalahan yang diharapkan.

Semua 3 komentar

Contoh yang lebih sederhana:

const foo: { [key: string]: string } = {}
if (foo.bar === undefined) {
    // blah
}

akan menghasilkan

ERROR: /Users/yuya/repo/github.com-private/codetakt/pf-user-admin/client/test.ts[2, 5]: Expression is always false.

tetapi tidak ada kesalahan yang diharapkan.

tslint bukan tempat yang tepat untuk menambahkan penanganan khusus semacam ini. Ini akan membutuhkan perubahan dalam inferensi tipe TypeScript. https://github.com/Microsoft/TypeScript/issues/13778

Jika Anda selalu memeriksa undefined sebelum menggunakan nilai, Anda juga dapat menentukan tanda tangan indeks untuk menyertakan undefined ;

const foo: { [key: string]: string | undefined } = {}

+1 ke ajafff ​​- tutup karena ini adalah titik desain TypeScript.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat