Definitelytyped: [D3] Perbaiki Definisi/Pengurangan Hutang Teknis

Dibuat pada 13 Feb 2018  ·  45Komentar  ·  Sumber: DefinitelyTyped/DefinitelyTyped

  • [x] [Sebutkan](https://github.com/blog/821-mention-somebody-they-re-notified) penulisnya (lihat Definitions by: di index.d.ts ) agar mereka dapat menanggapi.

    • Penulis: @tomwanzek @gustavderdrache @Ledragon

Saya membuat masalah ini sebagai masalah pelacakan pengganti #11365, #11365 dan #17846.

Berikut adalah tabel untuk melacak perbaikan/utang teknis terkait definisi modul D3.

  • JSDoc: Lengkapi komentar JSDoc termasuk parameter dan penjelasan generik
  • strictNullChecks: Divalidasi untuk strictNullChecks dan opsi kompiler disetel ke true
  • strictFunctionTypes: Divalidasi untuk strictFunctionTypes dan opsi kompiler disetel ke true
  • TS 2.3: Versi minimum TS 2.3 dan definisi menggunakan default untuk obat generik

| Definisi| JSdoc | strictNullChecks | strictFunctionTypes | TS 2.3 |
| --- | --- | --- | --- | --- |
| d3 | T/A | | | |
| d3-array | | | | |
| sumbu d3 | | | | |
| d3-kuas | | | | |
| d3-kord | | | | |
| d3-koleksi | | | | |
| d3-warna | | | | |
| d3-kontur | | | | |
| d3-pengiriman | | | | |
| d3-seret | | | | |
| d3-dsv | | | | |
| d3-kemudahan | | | | |
| d3-ambil | | | | |
| d3-gaya | | | | |
| format d3 | | | | |
| d3-geo | | | | |
| d3-hexbin | | | | |
| d3-hierarki | | | | |
| interpolasi d3 | | | | |
| d3-jalur | | | | |
| poligon d3 | | | | |
| d3-quadtree | | | | |
| antrian d3 | | | | |
| d3-acak | | | | |
| d3-permintaan | | | | |
| d3-sankey | | | | |
| skala d3 | | | | |
| d3-skala-kromatik | | | | |
| d3-seleksi | | | | |
| d3-pilihan-multi | | | | |
| bentuk d3 | | | | |
| h3-waktu | | | | |
| format waktu d3 | | | | |
| d3-timer | | | | |
| d3-transisi | | | | |
| d3-voronoi | | | | |
| d3-zoom | | | | |

"Di luar" pemeliharaan tim inti:

| Modul | JSdoc | strictNullChecks | strictFunctionTypes | TS 2.3 |
| --- | --- | --- | --- | --- |
| d3-hsv | | | | |

Komentar yang paling membantu

@denisname @gustavderdrache @ledragon Terima kasih atas semua kerja kerasnya selama ini. Saya memperbarui tabel pelacakan, sudah terlihat jauh lebih cantik! karena tabel pelacakan yang cantik adalah yang kami tuju di sini :senyum:

Semua 45 komentar

@gustavderdrache @Ledragon Di atas saya menggabungkan beberapa tugas luar biasa ke putaran oeuvre yang merupakan kumpulan definisi D3.

Pertanyaan kunci: Apakah kita ingin memutakhirkan semua definisi secara konsisten ke batasan TS >=2.3 dan dalam prosesnya menghapus beberapa fungsi/metode yang berlebihan dengan menggunakan penetapan default untuk obat generik?
Saya perhatikan bahwa (secara tidak sengaja) beberapa definisi sudah memiliki batasan // TypeScript Version: 2.3 di header definisi. Misalnya d3-geo , yang menggunakan definisi geoJson . Ini sudah menggunakan default generik.

Pikiran Anda tentang masalah ini akan lebih dari diterima.

Pahami ini, Anda harus mempelajarinya

Jika menerapkan minimum TS 2.3, kita juga harus dapat menggunakan tipe object alih-alih any , jika sesuai. Datang dengan TS 2.2. Jika saya ingat dengan benar, ada beberapa peluang dengan interpolator objek dan dalam koleksi d3.

Pikiran pertama:

  • Karena bug kehabisan memori yang Anda temui, bukankah kami harus menerapkan 2.4 di semua tempat?
  • Saya memiliki cabang dengan strictNullChecks dan strictFunctionTypes di sini . Saya akan memperbaruinya dan mengirimkan PR. Saya pikir saya melakukannya, tetapi sepertinya tidak

Saya harus belajar tentang generik default sebelum saya memiliki pendapat tentang ini :p

Dengan TS 2.3 kami melihat rilis dari April 2017.
TS 2.4 dirilis Juni 2017.

Jadi pertanyaan besarnya adalah: apakah kita membuat masalah di bagian besar atau dapat diabaikan/tidak ada bagian dari pangkalan yang dipasang saat memaksa minimal 2,4 (bukan 2,3)?

Saya kira salah satu tantangan tambahan adalah bahwa kami tidak memiliki Changelog sendiri untuk menandai perubahan yang berpotensi melanggar cara definisi D3 dikonsumsi. Dan pemutusan yang jelas, bahwa perubahan yang melanggar dapat terjadi dalam rilis definisi versi minor, karena mereka selaras dengan siklus rilis D3 yang mendasarinya.

@gustavderdrache Apa pendapat Anda tentang TS 2.4 sebagai minimum baru?

Seperti yang terlihat di PR #23654, kita tampak mengalir dengan cepat ketika pergi ke TS 2.4 (bahkan jika itu hanya memaksakan kendala demi DT tanpa menggunakan fitur TS 2.4 seperti string enums).

Untuk kejelasan sesuai PR #23724 yang baru, kita dapat melanjutkan hanya dengan menggunakan TS 2.3. Tidak perlu maju dengan TS 2.4 seperti sekarang.

@Ledragon Jika Anda ingin membuka PR yang sudah tertunda di garpu d3-geo lokal Anda, maka kami dapat bekerja untuk mencentang kotak di atas.

Saya sebenarnya tidak bisa mengujinya secara lokal... Jadi saya pikir saya bisa mengirimkannya, tapi saya tidak berpikir itu akan lulus tes travis. Saya akan pergi ke depan dan melihat

23794 terkirim - bukan karya saya yang paling membanggakan, mari kita lihat bagaimana kelanjutannya...

Oke, jadi masalahnya adalah sebagai berikut: d3-geo tes gagal di TS 2.3, jadi saya mencoba mengatur versi ke 2.4. Namun, d3 global disetel ke TS 2.3, jadi itu juga tidak berfungsi. Adakah saran tentang cara melanjutkan?

Saya akan melihat PR g3-geo dan akan memberikan komentar ulasan apa pun di sana agar tetap fokus. Tidak seperti bug OoM yang saya miliki dengan d3-collection , kami memiliki pesan kesalahan yang tepat untuk digunakan

Baru saja mengirimkan #24118 untuk memperbarui d3-contour ke 1.2.0
Saya perhatikan bahwa tipe d3-contour sudah ada di TS2.3 , dan strictNullChecks dan strictFunctionTypes disetel ke true :-)

Terima kasih telah tetap di atas d3-contour , membuat saya memperhatikan bahwa untuk beberapa alasan aneh saya tidak memiliki repo di "Menonton". Berubah itu! :senyum:

Akan melihat PR segera.

Saya sedang mengerjakan d3-axis dan d3-format. Saya hampir selesai. Tapi ada beberapa pertanyaan...

Dalam format d3 saya ingin menggunakan antarmuka Numeric yang sama dengan di d3-array:

interface Numeric {
    valueOf(): number;
}

Tetapi ketika melakukan ini, dalam definisi global d3, saya secara logis memiliki kesalahan: Module 'd3-array' has already exported a member named 'Numeric'. Apakah ada tempat untuk meletakkan tipe bersama untuk perpustakaan d3?

Juga dalam beberapa definisi d3 (interpolasi, skala, bentuk) Anda dapat menemukan tipe gabungan number | { valueOf(): number } . Apakah { valueOf(): number } tidak cukup?

@denisname Terima kasih telah menjadi sukarelawan untuk d3-axis , d3-format dan kemudian d3-array !!!

Untuk pertanyaan Anda di atas:

(1) Sebagai aturan dasar untuk menulis definisi modul d3-xxx , definisi tidak boleh memperkenalkan dependensi yang tidak ada di antara modul D3 terkait yang mendasarinya. Misalnya d3-axis tidak memiliki ketergantungan pada d3-array , oleh karena itu, definisi file index.ts untuk d3-axis tidak boleh diimpor dari d3-array . Ini memastikan kopling longgar yang sesuai dengan sumber JS. Jadi jika ragu, periksa properti dependencies dari package.json modul D3 yang mendasarinya _Catatan: Anda tentu saja dapat mengimpor dari paket apa pun dalam file d3-xxx-test.ts , ini bahkan bagus praktik yang kami ikuti dalam sejumlah paket untuk pengujian "integrasi". Yaitu mungkin tidak ada ketergantungan formal antara dua paket, tetapi anggota dari satu paket "secara alami" menggunakan input untuk paket lainnya. Misalnya kita menggunakan d3-selection dalam pengujian di d3-chord untuk memastikan jalur akord dapat diteruskan ke penyetel atribut pilihan tanpa masalah._

(2) Anda benar, bahwa antarmuka Numeric tidak dapat dideklarasikan ulang dalam modul D3 lainnya, yang tidak dapat mengimpor dari d3-array sesuai dengan aturan (1).

(3) Apakah { valueOf(): number } tidak cukup? Secara teknis, ya. Praktis, tipe persimpangan, meskipun memiliki beberapa redundansi, secara deklaratif mungkin lebih jelas untuk banyak pengguna manusia. Yaitu itu menunjukkan bahwa number adalah tipe yang valid pada pandangan pertama tanpa akrobat mental. :mengedip:

Tentang d3-color, mengapa prototype semua dikomentari? Itu telah dilakukan dalam komit ini oleh @tomwanzek.

Dengan setel ulang prototipe, kita dapat menggunakan instanceof secara langsung, tanpa memerlukan fungsi typeguard:

let cRGB: d3.RGBColor;
let cHSL: d3.HSLColor;

const c: d3.RGBColor | d3.HSLColor = d3.color("steelblue");

if (c instanceof d3.rgb) {
    cRGB = c;
} else {
    cHSL = c;
}

@denisname Saya ragu-ragu untuk mendefinisikan prototype sebagai bagian dari API yang diterbitkan dalam sebuah antarmuka, rasanya terlalu retas.

Untuk apa yang saya pahami dari spec guard tipe hari ini. Ini sekarang dianggap sebagai _konstruksi_ yang valid. Lihat item daftar:

Penjaga tipe dari formulir x instanceof C , di mana x bukan tipe Any, C adalah subtipe dari tipe global 'Function', dan C memiliki properti bernama 'prototipe' [...]

Saya ingin mengusulkan strictNullChecks versi d3-color . Yang hanya perubahan satu baris. Ini akan menjadi kesempatan untuk menambahkan prototype juga.

Dari pengujian saya sendiri, Anda memerlukan properti prototype atau deklarasi new(): T untuk instanceof untuk mempersempit tipe dengan benar. Saya menggunakan variasi new(): Color dalam pengetikan v3, dan mungkin berguna jika idiom itu masih didukung oleh D3v4 ke atas.

Karena salah satunya tampak baik-baik saja, saya pikir kita mungkin mengikuti konvensi v3 untuk kontinuitas. Kerja bagus, keduanya.

@gustavderdrache

Pemahaman saya tentang mengapa ini bekerja di d3 v3 adalah bahwa tipe pengembalian new() selalu sama dengan tipe prototype . Tetapi di d3 v4 kami juga memiliki:

export const color: ColorFactory;
export interface ColorFactory extends Function {
    (cssColorSpecifier: string): RGBColor | HSLColor;
    prototype: Color; // and not RGBColor | HSLColor !
}

Memang, d3.lab(0,0,0) instanceof d3.color benar. Oleh karena itu, jika kita mengubah antarmuka ini menjadi:

export const color: ColorFactory;
export interface ColorFactory extends Function {
    (cssColorSpecifier: string): RGBColor | HSLColor;
    new (cssColorSpecifier: string): RGBColor | HSLColor;
}

Kami tidak memiliki prototype untuk ColorFactory tipe Color . Dan kode berikut gagal dikompilasi, padahal seharusnya tidak.

declare let l: d3.LabColor | null;
declare let c: d3.Color;
declare let nil: null;

if (l instanceof d3.color) {
    c = l; // l is not inferred as `d3.LabColor`...
} else {
    nil = l; // fail, l is a `d3.LabColor | null` should be a `null`
}

Apa pendapat Anda? Apakah ada cara untuk membuatnya bekerja dengan new ? Terima kasih.

Sepertinya properti prototype untuk color() seharusnya Color dan bukan RGBColor | HSLColor , berdasarkan beberapa pengujian:

> d3.color.prototype === d3.rgb.prototype
false
> d3.rgb.prototype instanceof d3.color
true

Fungsi color() mengembalikan warna RGB atau HSL, tetapi prototipenya adalah supertipe dari ruang warna lainnya.

@denisname @Ledragon @gustavderdrache karena Anda semua ada di utas ini, sebagai FYI singkat: Saya bermaksud untuk mengejar item terbuka yang Anda ketahui akhir pekan ini.

Baiklah, d3-geo keluar (terima kasih @ledragon) dan saya mengomentari PR @denisname yang sayangnya ditutup untuk d3-format dan d3-axis terkait pembukaan kembali.

Sebagai catatan umum, saya akan merekomendasikan @denisname ditambahkan sebagai pengelola lain untuk definisi, mereka bekerja.

Saya mungkin akan melihat d3-color selanjutnya, dan bergabung dengan pembaruan ke 1.1.0 . Haruskah kami membuka edisi terpisah untuk peningkatan ini?

Juga, selamat datang di @denisname !

@Ledragon Terima kasih.

Saya memiliki pembaruan yang siap untuk d3-color (belum ada lhc dan gray ). Aku hanya terjebak oleh satu masalah kecil .

@gustavderdrache berkata:

Fungsi color() mengembalikan warna RGB atau HSL, tetapi prototipenya adalah supertipe dari ruang warna lainnya.

Memang dan ini bisa _typed_ dengan mudah, lihat antarmuka pertama di komentar saya. Tetapi @tomwanzek mengusulkan untuk menggunakan hanya new() dan menghindari prototype . Saya pikir dalam kasus khusus ini tidak mungkin. Tidak?...

Setelah memainkannya lagi, saya melihat masalahnya. Anda dapat mengatur new(): Color di antarmuka ColorConstructor , tetapi itu tidak benar-benar mencakup nilai kembalian fungsi:

declare namespace d3 {
  interface Color {
    // I forgot what was on the Color interface
    // This property exists just to make Color incompatible with {}
    __isColor: never;
    toString(): string;
  }

  interface RGBColor extends Color {
    r: number;
    g: number;
    b: number;
  }

  interface HSLColor extends Color {
    h: number;
    s: number;
    l: number;
  }

  interface LABColor extends Color {
    l: number;
    a: number;
    b: number;
  }

  interface ColorConstructor {
    (specifier: string): RGBColor | HSLColor;
    new(specifier: string): Color; // <- TS uses this for narrowing with instanceof
  }

  const color: ColorConstructor;
}

declare let l: d3.LABColor | null;
declare let c: d3.Color;
declare let nil: null;

if (l instanceof d3.color) {
  // Succeeds with l: d3.LABColor
  c = l;
} else {
  // Succeeds with l: null
  nil = l;
}

Kesimpulannya: Saya pikir kita harus mengekspos properti prototype , karena itu benar-benar satu-satunya cara untuk menutupi perilaku yang benar dari pengujian konstruktor dan instanceof :

  interface ColorConstructor {
    (specifier: string): RGBColor | HSLColor;
    new(specifier: string): RGBColor | HSLColor;

    readonly prototype: Color; 
  }

Maaf, atas keterlambatan membalas ini. Jangan ragu untuk menggunakan prototype , pada hari itu, itu adalah dorongan pertama saya untuk membahas instanceof juga. Itu hanya "merasa" hacky, tetapi karena dianggap sebagai praktik yang dapat diterima, dan jika kontinuitas dengan menggunakan new() seperti pada D3v3 bukanlah suatu pilihan...Mari kita lakukan apa yang berhasil!

@tomwanzek bisakah Anda memperbarui tabel pelacakan.

Sebuah harus diatur dalam kolom strictNullChecks strictFunctionTypes dan TS 2.3 untuk perpustakaan d3-axis , d3-color , d3-dispatch , d3-format , d3-polygon dan d3-hsv .

Juga harus disetel di kolom JSDoc untuk d3-dispatch , d3-polygon dan d3-hsv .

Terima kasih

Ada kesalahan ketik di antarmuka $ d3-geo GeoIdentityTranform . Seharusnya GeoIdentityTransform (dengan s ). Bolehkah saya mengoreksinya? Ada kekhawatiran tentang kompatibilitas mundur?

@denisname untuk d3-geo s GeoIdentityTranform , saya pikir kita bisa melakukan hal berikut:

  • Ganti nama antarmuka yang salah eja (Bagus!) (termasuk penggunaannya sebagai tipe pengembalian geoIdentity()
  • Untuk sementara tambah
/**
 * <strong i="13">@deprecated</strong> Misspelled name. Use GeoIdentityTransform.
 */
export type GeoIdentityTranform = GeoIdentityTransform;
  • Pada tahap selanjutnya yang nyaman, hapus semua jenis yang salah eja.

@denisname @gustavderdrache @ledragon Terima kasih atas semua kerja kerasnya selama ini. Saya memperbarui tabel pelacakan, sudah terlihat jauh lebih cantik! karena tabel pelacakan yang cantik adalah yang kami tuju di sini :senyum:

karena tabel pelacakan yang cantik adalah yang kami tuju di sini

Sangat! Definisi tipe yang ditingkatkan hanyalah efek samping yang menyenangkan.

Apakah ada di antara Anda yang sedang mengerjakan definisi spesifik saat ini untuk menyelesaikan utang teknis? Sementara d3-array sedang dalam proses. Saya akan menangani strictFunctionTypes di d3-transition berikutnya untuk membawanya ke paritas dengan d3-selection . Tinggal menunggu #25805 untuk digabungkan.

Bukan ATM. Akan memberi tahu Anda semua jika dan kapan saya melakukannya

Bekerja pada #25582 untuk dapat mencap bundel global 5.2.0

Saya memiliki pembaruan untuk d3-hierarchy siap (ketat dan jsDoc).
Juga mengerjakan d3-dsv dan d3-fetch (ts 2.3).

@denisname @tomwanzek @gustavderdrache
Haruskah kita fokus pada ini, atau memperbarui d3 ke versi terbaru? Kami sekarang 5 versi minor di belakang pada paket global (meskipun semua sub-paket siap untuk 5.2.0 saya pikir). Haruskah saya membuka edisi terpisah untuk melacak status paket global?

@Ledragon Saya akan mengikuti PR terbuka malam ini dan menguraikan semua definisi modul D3 untuk mata uang. Jika ada kelambatan, saya akan membuat satu masalah pelacakan untuk membuatnya normal. Adapun prioritas, saya setuju bahwa mata uang harus diprioritaskan daripada pengurangan utang teknis.

Maaf mencemari utas ini, saya kembali ke D3.js sekarang untuk proyek baru .. dan saya bertanya-tanya apakah memiliki anotasi TypeScript sebaris dipertimbangkan untuk D3?

/** <strong i="6">@type</strong> {SyncBailHook<Compilation>} */
shouldEmit: new SyncBailHook(["compilation"]),

Di webpack, mereka mulai menggunakannya untuk memeriksa JavaScript dengan kompiler TypeScript.. plus besar adalah definisi pengetikan langsung di sebelah kode yang sebenarnya.
https://github.com/webpack/webpack/blob/master/lib/Compiler.js#L51

Hai @phil-lgr
Ada diskusi tentang pelacak masalah d3 belum lama ini, dan tampaknya tidak berada di urutan teratas daftar prioritas (yaitu Mike Bostock lebih suka berfokus pada pengembangan perpustakaan itu sendiri daripada pengetikan). Sepertinya saya tidak dapat menemukan tautan ke utas. Mungkin pertanyaannya bisa dimunculkan lagi berkat informasi baru ini, tapi saya rasa itu tidak mungkin terjadi

@tomwanzek bisakah Anda memperbarui tabel pelacakan.

Sebuah harus diatur dalam kolom strictNullChecks strictFunctionTypes dan TS 2.3 untuk perpustakaan d3-array , d3-array , d3-dsv , d3-fetch , d3-hexbin , d3-hierarchy , d3-interpolate , d3-quadtree , d3-queue d3-request d3-timer dan d3-voronoi .

Juga harus disetel di kolom JSDoc untuk d3-color , d3-hexbin , d3-hierarchy , d3-interpolate dan d3-quadtree .

Terima kasih

Apakah halaman ini membantu?
0 / 5 - 0 peringkat