type SumOrConcat = {
(a: number, b: number): number
(a: string, b: number): string
}
const result: SumOrConcat = (a: number | string, b: number): any => {
if (typeof a === 'number') {
return a + b
}
return `${a} ${b}`
}
Но надежнее все же так:type SumOrConcat = {
(a: number, b: number): number
(a: string, b: number): string
}
const result = ((a: number | string, b: number): number | string => {
if (typeof a === 'number') {
return a + b
}
return `${a} ${b}`
}) as SumOrConcat;
Ну и надо отметить, что синтаксис самих перегрузок таких проблем не имеет, хотя стрелочную функцию с ним не опишешьfunction sumOrConcat(a: number, b: number): number;
function sumOrConcat(a: string, b: number): string;
function sumOrConcat(a: number | string, b: number): number | string {
if (typeof a === 'number') {
return a + b
}
return `${a} ${b}`
}
const result = sumOrConcat;
Ну или, может, какие-то другие варианты есть?
Какое регулярное выражение использовать для валидации числа по нижеуказанным требованиям?Никакое, ибо не зачем.
Валидация делается по событиям keyup и pasteПочему бы не городить костыли и просто не использовать событие input?
async function fetchRecursive(arr) {
const result = [];
if (Array.isArray(arr)) {
for (const n of arr) {
try {
result.push({ status: true, result: await fetch(n.url).then(r => r.json()) });
} catch(error) {
result.push({ status: false, error });
}
result.push(...await fetchRecursive(n.children));
}
}
return result;
}
const flat = arr => (arr || []).flatMap(n => [ n.url, ...flat(n.children) ]);
const fetchRecursive = arr => Promise.allSettled(flat(arr).map(n => fetch(n).then(r => r.json())));
function format(value){
let [a,b] = (+value.replace(/[^\d\.,]/g,'').replace(',','.')).toFixed(2).split('.')
c = a.replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ')
return `${c},${b}`
}
console.log(format('12734,589'))
// 12 734,59
console.log(format('1 2 7 3s4.5'))
// 12 734,50
console.log(format('12734'))
// 12 734,00
<input type="text" id='price' placeholder="12 345,90" required pattern="^\d{1,3}(\s?\d{3})*([\.,]\d+)?$" />
watch: {
'$route.params.slug': {
immediate: true,
handler() {
// сюда переносите код из created
},
},
},
<child :somedata="data1" @bestEventEver="someMethod"/>
this.$emit('bestEventEver', 'params pam pams')
:v-model и .sync
, читай официальный гайдНо если, например, мне нужно, чтобы текст при изменении динамически менялся не только в textarea, но и в другом, изначально не связанном с textarea компоненте
<div id="app">
<router-view></router-view>
</div>
<main class="main">
<app-aside></app-aside>
<router-view></router-view>
</main>
<section class="app__section">
<section-header></section-header>
<router-view></router-view>
</section>
const unique = (arr, keys) =>
arr.filter(n => n === arr.find(m => keys.every(k => m[k] === n[k])));
const result = unique(arr, [ 'model', 'param1', 'param2' ]);
const unique = (arr, keys) =>
arr.filter(function(n) {
const picked = keys(n).reduce((acc, k) => acc.set(k, acc.get(k) || new Map).get(k), this[0]);
return !picked.set(this[1], picked.has(this[1])).get(this[1]);
}, [ new Map, Symbol() ]);
const result = unique(arr, n => [ n.model, n.param1, n.param2 ]);
const groupedData = data.reduce((acc, {sport, sub}) => {
const elem = acc.find((item) => item.sport === sport);
if (elem) {
elem.subs.push(sub);
} else {
acc.push({
sport,
subs: sub ? [sub] : []
});
}
return acc;
}, []);
const $ul = $('<ul>', {
id: 'list'
}).appendTo('body');
const elems = groupedData.map(({sport, subs}) => {
return `
<li>${sport}<ul>
${subs.map((sub) => `<li>${sub}</li>`).join('')}
</ul>
</li>
`;
}).join('');
$ul.append(elems);