Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
IsAny はなぜ any だけを見抜けるのか
Search
Riya Amemiya
July 23, 2026
Technology
86
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
IsAny はなぜ any だけを見抜けるのか
Riya Amemiya
July 23, 2026
More Decks by Riya Amemiya
See All by Riya Amemiya
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
230
V8のArray.prototype.flatを最大約20倍速くするまでと、巨大OSSへの大規模コミットの道のり
riyaamemiya
0
340
V8コントリビュート超入門
riyaamemiya
0
220
V8のTorqueを語りたい
riyaamemiya
0
130
知ってた?JavaScriptの"正しさ"を検証するテストが5万以上もあること(Test262)
riyaamemiya
1
390
「え?!それ今ではHTMLだけでできるの!?」驚きの進化を遂げたモダンHTML
riyaamemiya
12
6.2k
そのJavaScript、V8が泣いてます。V8の気持ちを理解して書くパフォーマンス最適化
riyaamemiya
22
8.9k
「え?!それ今ではCSSだけでできるの!?」驚きの進化を遂げたモダンCSS
riyaamemiya
1
220
不健康エンジニア「健康」を知る
riyaamemiya
1
1.4k
Other Decks in Technology
See All in Technology
演劇と私とスクラム
chinmo
0
160
AIエージェント時代、Kaggleにどう取り組むか
takanao
1
170
プロダクトが成長すると、 プロダクトマネージャーの仕事はどう変わるのか - 「まず作る」から「小さく学び、確かめながら進む」へ
sansantech
PRO
1
370
Microsoft のサポート ライフサイクルを理解する
murachiakira
PRO
0
210
Agent × Maestro で始める モバイル E2E 端末準備からテスト実行・結果確認まで
sansantech
PRO
0
210
書き手が人でもAIでも正しくなる道、SREを埋め込んだDeveloper Platform / tech drivers day8
chmikata
4
760
AI秘書と毎日働くのはもう当たり前。開発以外の業務に足りない機能をどう埋める?
minorun365
PRO
2
1.7k
トークン化預金DCJPYの取り組みと活用ユースケース
finengine
0
250
Claude Code on Bedrock で統制をかける小ネタ集/claude-code-bedrock-governance-tips
emiki
1
13k
Obsidian Vault Architectures
x5gtrn
PRO
0
150
背中から、背中へ ー 社外コミュニティで学んだ「雑に背中を押す」という恩送り ー / easygoing encouragement and pay forward to community
naitosatoshi
0
320
「Learning Outcome」を書きたくない私が、Learning Outcomeと折り合いをつけるまで
mhlyc
0
240
Featured
See All Featured
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.2k
Facilitating Awesome Meetings
lara
57
7.2k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
450
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
560
Why Our Code Smells
bkeepers
PRO
340
58k
Chasing Engaging Ingredients in Design
codingconduct
0
370
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
Amusing Abliteration
ianozsvald
1
360
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Into the Great Unknown - MozCon
thekraken
41
2.8k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
We Have a Design System, Now What?
morganepeng
55
8.4k
Transcript
T Y P E S C RIP T / T
Y P E - C H A L L E N G E S はなぜ any だけを見抜けるのか IsAny 西 悠太 / 株式会社ダイニー
自己紹介 西 悠太 (Nishi Yuta) V8 Contributor Platform Engineer at
Dinii Inc. TSKaigi Staff TypeScriptが好きです。 型パズルも好きです。 @riya-amemiya
お題は IsAny type-challengesに、anyだけをtrueにするIsAnyを作ろうという問題があります。 type IsAny<T> = /* ??? */ type
A = IsAny<any> // true type B = IsAny<unknown> // false type C = IsAny<never> // false type D = IsAny<string> // false
一見簡単そうですが、 実際解き始めると 。 うまくいきません
まずextends の意味をおさらい extendsはよく説明の時にif文のように説明されますが、正確には左辺は右辺の部分集合かどうかがイメージ としては近いです。 厳密には部分集合も説明としては違いますが、ここではイメージの話なのでextendsは 部分集合と説明します。 type A = 1
extends 1 ? true : false // true type B = 1 extends 2 ? true : false // false じゃあanyにextendsしてあげると良さそうですね。
試み① T extends any type IsAny<T> = T extends any
? true : false type A = IsAny<any> // true type D = IsAny<string> // true ← string でも true どんな型でも any には代入できるので、any 以外まで true になってしまいます。
試み② unknown extends T type IsAny<T> = unknown extends T
? true : false type A = IsAny<any> // true type B = IsAny<unknown> // true ← unknown まで true type D = IsAny<string> // false unknown を受け取れるのは any と unknown だけ。 惜しいところまで来ますが、unknown を除外できません。 IsAnyはanyだけをtrueにしたいので、これもダメです。
ですがany をうまく使うと とてもスマートに書けます。 の特性
答えは、この1行 type IsAny<T> = 0 extends 1 & T ?
true : false // 0と1の部分は絶対に重ならない2つのリテラル型ならなんでもいいです
交差型について考えてみる 交差型はAとBの両方を満たす型を作れる演算子です。 基本的には狭い方を優先します。 先ほどの例を簡単に表現すると type IsAny<T> = 0 extends 1
& T ? true : false は「Tは1と交差可能で、かつ0の部分集合になる型である」と言い換えられるのではないでしょうか。 1はnumberより狭い型なので、普通に考えるとこれを満たす型はないはずです。
分解① 1 & T type T1 = 1 & number
// 1 type T2 = 1 & string // never type T3 = 1 & unknown // 1 type T4 = 1 & never // never type T5 = 1 & any // any anyだけは全ての型と交差可能で、その交差の結果はanyになります。
分解② 0 extends 1 type R1 = 0 extends 1
? true : false // false type R2 = 0 extends never ? true : false // false type R3 = 0 extends any ? true : false // true 0 は 1 にも never にも代入できないので、 0 extends 1 & T は本来「絶対に false」の式です それを true にできる唯一の抜け道が any です。
評価を追う IsAny<string> 0 extends 1 & string → 0 extends
never → false IsAny<number> 0 extends 1 & number → 0 extends 1 → false IsAny<unknown> 0 extends 1 & unknown → 0 extends 1 IsAny<any> 0 extends 1 & any → 0 extends any → false → true 前述の2つの性質を同時に持つ型は any しかありません
any は、上でも下でもある unknown never any 何でも受け取れるが、他の型には 入れない どの型にも入れるが、何も受け取 れない 両方できる。型の階層の外にいる
any は「型チェックをやめる」ための型なので、代入の階層に縛られません。 IsAny は、この階層の外にいる性質そのものを検出しています。
おまけ① 条件型は両方の分岐を返す type X = any extends string ? 1
: 2 // 1 | 2 判定される側に any を置くと、true とも false とも決められないので、 両方の枝のユニオンが返ってきます。
おまけ② any でも代入できない時がある declare const a: any const s: string
= a // OK const n: never = a // Error: Type 'any' is not assignable to type 'never' 何にでも代入できる any が、唯一 never にだけは入れません。
まとめ ✓ IsAny は 0 extends 1 & T の1行で書ける
✓ どんな型とも交差できるのは any だけ ✓ 「絶対に false」の代入を true にできるのも any だけ ✓ any は上にも下にも振る舞う、型の階層の外の型
参考資料 GitHub: type-challenges/type-challenges TypeScript Handbook: Everyday Types — any
ご清聴ありがとうございました 0 extends 1 & T。 この1行に、any のすべてが詰まっている。