type ExtractGenerics<T extends readonly unknown[]> = T extends readonly []
? []
: T extends readonly [G<infer V>, ...infer Next]
? [V, ...ExtractGenerics<Next>]
: never;
function unwrap<C extends readonly G<unknown>[]>(containers: C) {
return containers.map(container => container.value) as ExtractGenerics<C>
}
function func(mixedData) {
const id = mixedData?.target?.id ?? mixedData;
console.log(id);
}
func(123) // 123
func({target: {id: 456}}) // 456
?.
— optional chaining??
— Nullish coalescing operatorconst sum = number => {
if (number < 0) return 0;
// вспомогательная функция считает сумму ряда с шагом step
const sequenceSum = step => {
const q = Math.floor(number / step);
return q * (q + 1) * step / 2;
}
return sequenceSum(3) + sequenceSum(5) - sequenceSum(3 * 5);
}
sum(18) // 78
<div class="block">
<!-- Header -->
<div class="block__header">
<h2 class="block__title">Title</h2>
<div class="block__actions">
<button type="button" class="block__action block__action--edit">
<span class="block__action-icon"></span>
</button>
</div>
</div>
<!-- Content -->
<div class="block__content">
<p>...</p>
</div>
<!-- Footer -->
<div class="block__footer">
<div class="block__about">
<div class="block__author"></div>
<div class="block__date"></div>
</div>
<div class="block__awards">
<div class="block__award">
<div class="block__award-inner"></div>
<div class="block__award-tooltip">
<div class="block__award-tooltip-content"></div>
<button type="button" class="block__award-tooltip-close"></button>
</div>
</div>
</div>
</div>
</div>
() => void
является потомком типа (param: any) => void
, а значит Ваш предикат в типе A становится истинным и уходит в ветку, где Вы возвращаете R из infer, который выводится к вершине иерархии - типу unknowntype A<T> = T extends (...param: infer P) => void
? P extends [infer R, ...unknown[]]
? R
: string
: string;
<nav>
<ul>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
</ul>
</nav>
nav {
width: 200px;
background: #92aef4;
}
ul {
--color: white;
--radius: 30px;
--smoothing-radius: 29.4px;
border-right: 10px solid var(--color);
padding: 0 0 2em 1em;
list-style-type: none;
}
a {
position: relative;
display: block;
padding: 0.5em;
border-radius: var(--radius) 0 0 var(--radius);
text-decoration: none;
color: #6704f2;
}
a::before {
content: "❄ ";
color: white;
}
a:hover::before {
color: deeppink;
}
a:hover {
background: var(--color);
}
a:hover::after {
content: "";
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
width: var(--radius);
height: calc(100% + 2 * var(--radius));
}
li:not(:last-child):not(:first-child) a:hover::after {
background: radial-gradient(at top left, transparent var(--smoothing-radius), var(--color) var(--radius)) no-repeat top right / var(--radius) var(--radius),
radial-gradient(at bottom left, transparent var(--smoothing-radius), var(--color) var(--radius)) no-repeat bottom 0 right 0 / var(--radius) var(--radius);
}
li:first-child a:hover::after {
background: radial-gradient(at bottom left, transparent var(--smoothing-radius), var(--color) var(--radius)) no-repeat bottom 0 right 0 / var(--radius) var(--radius);
}
li:last-child a:hover::after {
background: radial-gradient(at top left, transparent var(--smoothing-radius), var(--color) var(--radius)) no-repeat top right / var(--radius) var(--radius);
}
body {
padding: 50px;
margin: 0;
font-size: 20px;
font-family: 'Neucha', cursive;
background: #eee;
}
не могу найти в поиске
function test() {
return new Promise(async (resolve) => {
let result = null;
do {
result = await camel() || await new Promise(r => setTimeout(r, 1000));
} while (!result);
resolve(result);
});
}