null
(потому что именно такое значение по умолчанию ты передал).export const Context = createContext<{
sidebarIsOpen: boolean;
toggleSidebar: (value: boolean) => void;
} | null>(null)
или лучше export const Context = createContext({
sidebarIsOpen: false,
toggleSidebar: () => {}
});
json
, лучше тыкнуть в консоли на ответе "Copy object" и вставь в любой конвертер, который гуглится по "json to ts", например https://app.quicktype.io/. Так ты точно не ошибёшься, а потом уже можешь уточнить тип руками. unknown
и прогонять через тайпгард, проверяя руками, что он соответствует типу, но это не частая практика, увы. $.ajax({
url: "/handlers/barcode.php",
type: "get",
xhrFields: { responseType: 'blob'},
converters: {'* image': true},
data: {
data: 'ABC-abc-1239',
code: 'Code128',
},
success: function(response) {
$('#barcode').html('<img src="' + URL.createObjectURL(response) + '"/>');
},
error: function(xhr) {
console.log('Ошибка запроса')
}
});
fetch('/handlers/barcode.php?data=ABC-abc-1239&code=Code128')
.then(res => res.blob())
.then(URL.createObjectURL)
.then(src => {
$('#barcode > img').attr('src', src)
})
.catch(err => {
console.log('Ошибка запроса')
});
UserInfo
обратно совместим с BaseUserInfo
, т.к. для BaseUserInfo.getState()
возвращаемое значение имеет тип void
(не путать с undefined
), который никак не может быть использован (сам ts не даст).abstract class BaseUserInfo {
abstract getState(): void;
}
class UserInfo extends BaseUserInfo {
override getState = (): number => 1;
}
function useInfo(info: BaseUserInfo) {
// An expression of type 'void' cannot be tested for truthiness.(1345)
if (info.getState()) { // не получится так сделать и всё сломать
console.log('never')
}
}
var list = {
'[div]restored': 68,
'[div2]restored': 88,
'[mode]Easy [div]restored': 88,
'[mode]Normal [div]restored': 99
};
Object.entries(list).reduce((acc, [key, value]) => {
const keys = key
.split(/\[(.+?)\]/)
.map(k => k.trim().toLowerCase())
.filter(Boolean)
const last = keys.pop();
keys.reduce(
(sub, key) => sub[key] ?? (sub[key] = {}),
acc
)[last] = value;
return acc;
}, {});
window.location.origin
на origin
целевого сайта. Если к нескольким, то либо заменить на звёздочку(*
), если вам добра не жалко, либо вызывать postMessage
несколько раз подряд, по одному для каждого домена.attachEvent
? Серьёзно? api.get(`files/${id}`, {
responseType: 'blob'
}).then((r) => {
const url = URL.createObjectURL(r.data);
// ...
this
внутри function
зависит от контекста вызова этой function
.onAuthStateChanged
- вызывается переданная ему функция-обработчик, которой устанавливается какой-то this
(или не устанавливается, и тогда он по умолчанию window
или, в строгом режиме, undefined
). И этот this
точно никак не связан с текущим this
Vue, потому что тот никаким образом не передан при вызове, и, соответственно onAuthStateChanged
о нём ничего не знает.(async function(user) { ... }).bind(this)
чтобы жёстко привязать эту функцию к this
.vm.g = 5;
, т.к. таким образом конкретный this
сохранён в переменную и не меняется в зависимости от контекста вызова.async (user) => { ... }
, её механика работы по сути осуществляет неявный bind
.bind
всех методов к this:onAuthStateChanged(this.onAuthStateChanged)
methods: {
onAuthStateChanged: async function (user) { ... }
}