Definitions by:
di index.d.ts
) agar mereka dapat menanggapi.Saya membuat masalah ini sebagai masalah pelacakan pengganti #11365, #11365 dan #17846.
Berikut adalah tabel untuk melacak perbaikan/utang teknis terkait definisi modul D3.
strictNullChecks
dan opsi kompiler disetel ke true
strictFunctionTypes
dan opsi kompiler disetel ke true
| 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 | | | | |
@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:
strictNullChecks
dan strictFunctionTypes
di sini . Saya akan memperbaruinya dan mengirimkan PR. Saya pikir saya melakukannya, tetapi sepertinya tidakSaya 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
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', danC
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:
geoIdentity()
/**
* <strong i="13">@deprecated</strong> Misspelled name. Use GeoIdentityTransform.
*/
export type GeoIdentityTranform = GeoIdentityTransform;
@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
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: