Hai!
Singkatnya, memanggil API apa pun dengan parameter yang secara eksplisit menentukan nilai undefined
mengarah pada fakta bahwa itu ditransfer ke VK. Di bawah ini adalah contoh.
await ctx.send("it'll fail", {
keyboard: undefined
});
ctx
- konteks acara message_new
Parameter dengan nilai undefined
tidak boleh dilewatkan, sama persis seperti jika dihilangkan.
VK-IO menerjemahkan undefined
menjadi string dan memberikannya ke server.
| paket | versi |
| ---------------------------------- | ------- |
| vk-io
| 4.0.1
|
| node
| 12.17.0
|
| TypeScript
| 4.0.2
|
| yarn
| 1.22.4
|
Tidak, tunggu, itu tidak bekerja seperti itu sedikit. Jelaskan kepada Anda?
Ayolah, ada apa sedikit?
Bahwa parameter dikirim menggunakan URLSearchParams
const params = {
message: 'hello',
keyboard: undefined
};
console.log(new URLSearchParams(params));
// Выведет: URLSearchParams { 'message' => 'hello', 'keyboard' => 'undefined' }
@isinkin Ya, tapi saya sudah menulis di PR bahwa ini adalah bug, karena TypeScript tidak membuat perbedaan sama sekali, parameter tidak ditentukan atau ditentukan dengan nilai undefined
, tetapi pada saat runtime ini sudah mengarah ke kesalahan API. Ini adalah semacam perangkap langsung.
@zardoy mengapa ini bug?
const obj = {
key: undefined,
}
const properties = Object.getOwnPropertyNames(obj)
console.log(properties)
Properti dideklarasikan, tipenya tidak ditentukan, dan ketika dikonversi ke string, string 'tidak terdefinisi' diperoleh.
Fakta bahwa sesuatu tidak bekerja dengan baik untuk ts sudah berlaku untuk ts, runtime pada v8, sebagai aturan, dan hanya mendukung javascript.
const obj = { key: undefined, } const properties = Object.getOwnPropertyNames(obj) console.log(properties)
Itu benar, tetapi mengapa transformasi ini? Lagi pula, jika kita ingin secara eksplisit meneruskan string dengan konten seperti itu, mengapa tidak secara eksplisit meneruskan string sebagai parameter?
vk.api.messages.send({
message: "undefined" // - так ок
});
Mungkin Anda benar bahwa ini bukan bug, tetapi hanya jebakan karena fakta bahwa ts tidak menimbulkan kesalahan kompilasi ketika Anda secara eksplisit menentukan undefined
. Namun, saran saya di PR adalah bahwa perilaku ketika kita menghilangkan parameter sepenuhnya dan menentukan undefined
akan sama, karena tidak selalu
Sori, yang saya tutup, sekarang saya tambahkan.
@zardoy saya mengerti apa yang anda maksud.
Tentunya Anda menulis sesuatu seperti
let someVariable;
const query = {
key: someVariable,
}
send(query)
Saya pikir masalah ini ada di pihak pengguna, Anda perlu menulis dengan cara yang berbeda, dan dengan pr ini Anda merusak kompatibilitas ke belakang.
Saya pikir masalah ini ada di pihak pengguna, Anda perlu menulis dengan cara yang berbeda, dan dengan pr ini Anda merusak kompatibilitas ke belakang.
Saya setuju.
Lihat saja di mana anjing itu dikuburkan (contoh yang lebih ilustratif):
Saya tidak bisa mengejanya seperti itu
Saya sudah bisa melakukan ini
ts akan bersumpah dengan baik, meskipun permintaan sebenarnya akan sama. Hanya jebakan bagi pengguna
@zardoy jadi jangan menulis apa pun jika Anda tidak ingin melewatkan parameter ini, itu akan berfungsi seperti yang Anda inginkan
vk.api.messages.send()
Ada agak ketidakcocokan perilaku, dengan JSON.stringify()
undefined
akan terlewatkan. Sementara URLSearchParams
mengarahkan semuanya ke string. Ini tidak akan merusak kompatibilitas mundur, karena yang dicentang adalah undefined
, bukan "undefined"
.
Tapi sekarang kita akan kehilangan pesan menarik di chat berupa undefined
:)
@negezor tentang pesan seperti yang saya maksud, ada kemungkinan seseorang menggunakan tipe yang tidak ditentukan ketika mereka ingin mencetak teks seperti itu)
upd: yah, alih-alih tidak terdefinisi, pengecualian akan dilemparkan dalam beberapa kasus, misalnya, ketika pesan kosong.
Mengapa Anda menentukan undefined dalam parameter sama sekali?
Indikasi eksplisit adalah contoh sederhana untuk tujuan pemahaman saja. Pada kenyataannya, nilai ini dapat berasal dari suatu fungsi, ketika objek digabungkan, dan dari banyak hal lainnya. Berikut ini contoh dari PR:
await ctx.send("Hey` there!", {
keyboard: await getKeyboardToSend() //undefined | KeyboardBuilder - соответствие типов, но ошибка ругается API
});
Di sini saya menggunakannya sebagai tipe fallback, yang berarti Anda tidak perlu menampilkan keyboard
Fakta bahwa URLSearchParams mengumpulkan undefined mungkin lebih fleksibel dan benar, tetapi kurang nyaman.
Saya tidak tahu banyak tentang vkapi dan sumber daya lib ini dan saya tidak bisa mengatakan apakah ada masalah, tetapi jika memang ada masalah perilaku yang berbeda dalam satu perpustakaan, maka ini harus diselesaikan.
Saya kira Anda dapat meneruskan isi permintaan secara langsung dan itu dikonversi ke JSON menggunakan JSON.stringify, yang memotong tidak terdefinisi tidak seperti URLSearchParams, ini membingungkan bagi pengguna.
Fakta bahwa URLSearchParams mengumpulkan undefined mungkin lebih fleksibel dan benar, tetapi kurang nyaman.
@talentumtuum tidak begitu setuju, saya bahkan dapat memberikan contoh dari lib lain yang sangat besar.
Ada perpustakaan prisma seperti itu (melaluinya Anda dapat membuat kueri ke database). Dan inilah salah satu contohnya:
const hisNotes = await prisma.userNote.findMany({
where: {
userName: "Dmitriy" // вернет записки только дмитрия
}
});
const allNotes = await prisma.userNote.findMany({
where: {
userName: undefined // не вернет записки пользователя "undefined"
}
});
// это равносильно
allNotes = await prisma.userNote.findMany({ });
upd: yah, alih-alih tidak terdefinisi, pengecualian akan dilemparkan dalam beberapa kasus, misalnya, ketika pesan kosong.
Saya setuju, bayangkan saja jika bot spam "tidak terdefinisi" pada perintah apa pun. Pengecualian yang lebih baik daripada omong kosong diam xd
upd: mungkin mereka setidaknya akan melihatnya di log, tetapi mereka akan memperbaikinya
Tetap saja, saya pikir bug lebih baik daripada posting yang bermasalah. Dalam alat seperti Sentry, sulit untuk melacak apa yang bukan bug. Versi utama 4 ditujukan untuk interaksi yang lebih baik dengan perpustakaan dan undefined
eksplisit tidak.
Ini juga memperbaiki perilaku yang tidak jelas antara URLSearamParams
dan JSON.stringify()
, diperbaiki di https://github.com/negezor/vk-io/commit/1026d333a07ff50423100f331e74a8041e2f567d , diposting di 4.0.2