Intersection type

인터섹션 타입

An intersection type requires a value to satisfy both component types.

···
html
<div class="visual intersection" data-step="0"><div class="visual-head"><strong>INTERSECTION</strong><i></i></div><div class="visual-scene"><div class="int-circle int-left"><span>A<br>id</span></div><div class="int-circle int-right"><span>B<br>time</span></div><div class="int-overlap">A &amp; B</div><div class="int-result mono">{ id, time }</div></div><div class="visual-caption"></div><div class="visual-dots"><b></b><b></b><b></b><b></b></div></div>
css
.visual{width:min(95vw,760px);height:min(91vh,330px);padding:clamp(9px,2.5vmin,18px);display:flex;flex-direction:column;gap:clamp(6px,1.7vmin,11px);border:1px solid var(--line);border-radius:13px;background:var(--surface);font:500 clamp(12px,3.4vmin,16px)/1.25 var(--font-sans,-apple-system),sans-serif}
.visual-head{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:19px;color:var(--accent)}.visual-head strong{font-size:1em}.visual-head i{display:block;width:8px;height:8px;flex:none;border-radius:50%;background:var(--accent);animation:visual-pulse 1.3s infinite}@keyframes visual-pulse{50%{opacity:.25}}
.visual-scene{position:relative;flex:1;min-height:0;overflow:hidden}.visual-caption{min-height:2.4em;display:grid;place-items:center;text-align:center}.visual-dots{display:flex;justify-content:center;gap:4px}.visual-dots b{display:block;width:15px;height:3px;border-radius:3px;background:var(--line)}.visual-dots b.on{background:var(--accent)}
.visual-scene *{box-sizing:border-box}.visual-scene .mono{font-family:ui-monospace,monospace}.visual-scene .muted{color:var(--muted)}.visual-scene .lit{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 14%,var(--surface))!important;color:var(--fg)!important}
.intersection .visual-scene{display:flex;align-items:center;justify-content:center;padding-bottom:22px}.int-circle{width:75px;height:75px;border:2px solid var(--accent-2);border-radius:50%;display:grid;place-items:center;text-align:center;line-height:1.1;background:color-mix(in srgb,var(--accent-2) 10%,transparent);transition:background .3s}.int-left span{transform:translateX(-18px)}.int-right span{transform:translateX(18px)}.int-right{margin-left:-20px;border-color:var(--accent-3);background:color-mix(in srgb,var(--accent-3) 10%,transparent)}.int-overlap{position:absolute;top:calc(50% - 11px);left:50%;transform:translateX(-50%);z-index:2;font:700 12px ui-monospace,monospace;color:var(--accent)}.int-result{position:absolute;bottom:0;text-align:center;font-size:12px;opacity:.75;transition:opacity .3s}.intersection[data-step="0"] .int-left{background:color-mix(in srgb,var(--accent-2) 25%,var(--surface))}.intersection[data-step="1"] .int-right{background:color-mix(in srgb,var(--accent-3) 25%,var(--surface))}.intersection[data-step="2"] .int-overlap{background:var(--accent);color:var(--surface);padding:4px;border-radius:4px}.intersection[data-step="3"] .int-result{opacity:1;color:var(--accent)}@media(min-width:600px){.int-circle{width:120px;height:120px}.int-right{margin-left:-34px}}
js
const root=document.querySelector('.visual'),cap=root.querySelector('.visual-caption'),dots=[...root.querySelectorAll('.visual-dots b')],captions=["A requires id","B requires time","Both requirements apply","Value supplies both"];let step=0;function advance(){root.dataset.step=String(step);cap.textContent=captions[step];dots.forEach((d,i)=>d.classList.toggle('on',i===step));if(root.classList.contains('generic')){root.querySelector('.generic-input').textContent=step===3?'"hi"':'7';root.querySelector('.generic-output').textContent=step===3?'"hi" : string':'7 : number'}if(root.classList.contains('union'))root.querySelector('.set-value').textContent=step%2?'value: "seven"':'value: 7';step=(step+1)%captions.length}advance();let timer=setInterval(advance,1100);root.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})

In TypeScript, A & B describes a value with the requirements of both object types. An object satisfying only one side is insufficient.

The demo combines an id field and a timestamp field into one record. Incompatible definitions for the same field can make an intersection unusable.

When to use

Use it to combine independent object property groups into one contract.

Open as page ↗