인터섹션 타입

Intersection type

두 타입의 요구사항을 모두 만족하는 값을 표현합니다.

···
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()})

TypeScript의 A & B는 두 객체 타입이 요구하는 필드를 함께 가진 값을 나타냅니다. 한쪽만 충족하는 객체는 이 타입에 넣을 수 없습니다.

데모는 id 필드와 timestamp 필드가 하나의 기록 객체에 모이는 과정을 보여줍니다. 같은 이름의 필드가 서로 양립할 수 없는 타입이면 사용할 수 없는 조합이 될 수 있습니다.

언제 쓰나

서로 독립적인 객체 속성 묶음을 합쳐 하나의 계약을 만들 때 사용합니다.

페이지로 열기 ↗