Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
値オブジェクト / Value Object
Search
OKUNOKENTARO
August 12, 2018
Technology
1.8k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
値オブジェクト / Value Object
フロントエンド百物語で発表した資料です。
OKUNOKENTARO
August 12, 2018
More Decks by OKUNOKENTARO
See All by OKUNOKENTARO
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
5
12k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
220
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
33
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.5k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.7k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.8k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
730
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.6k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Technology
See All in Technology
CTOキーノート:AI時代の「つなぐ」を再定義 ― 真のIoTとリアルワールドAI【SORACOM Discovery 2026】
soracom
PRO
0
330
PLaMoを毎日の開発で使い育てていく
pfn
PRO
0
140
Amazon Bedrock Managed Knowledge BaseDive Deep
ren8k
0
280
「休む」重要さ
smt7174
7
1.8k
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
1.9k
現場で使える AWS DevOps Agent 活用ノウハウ - Release Management 機能の検証結果を添えて / AWS DevOps Agent Release Management and Know-How
kinunori
5
790
カメラ×AIで挑む「ホワイト物流」― 車両管理、自動化の壁と突破口【SORACOM Discovery 2026】
soracom
PRO
0
180
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
570
GMOフィナンシャルゲートが挑む、「止まらない」決済インフラ構築の裏側【SORACOM Discovery 2026】
soracom
PRO
0
110
NetBoxを利用した作業効率化の試み_NetDevNight4
tnoha
0
390
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
1
150
脱Jenkins、インターン生が挑んだCIツールGitHubActions移行
mixi_engineers
PRO
1
280
Featured
See All Featured
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
750
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Done Done
chrislema
186
16k
Building Adaptive Systems
keathley
44
3.1k
The browser strikes back
jonoalderson
0
1.4k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
360
Docker and Python
trallard
47
4k
How to make the Groovebox
asonas
2
2.3k
Designing for Timeless Needs
cassininazir
1
420
Amusing Abliteration
ianozsvald
1
240
Building an army of robots
kneath
306
46k
Transcript
ΦϒδΣΫ τ "VH ϑϩϯ τΤϯ υඦޠ
ΦϒδΣΫ τͱ w %%% ʢυϝΠϯۦಈઃܭʣ Ͱड़ΒΕΔ֓೦ w +BWB4DSJQUʹTUSJOH OVNCFS CPPMFBOͱ͍͏
ϓϦ ϛςΟ ϒܕ͕͋Δ w TUSJOH OVNCFSΛ5ZQF4DSJQUͰͦͷ··ѻΘͣ ΦϒδΣΫ τͱͯ͠ఆٛ͢Δ͜ͱͰɺ ༷ʑͳΛࣝผՄೳʹ͢Δ
࣮ࡍͷҊ݅Ͱͷྫ w "2018/8"ͱ͍͏stringΛѻΘͣʹYearMonthܕͱ͢Δ w "-0900"ͱ͍͏stringΛѻΘͣʹTimeZoneܕͱ͢Δ w 1, 2, 3ͱ͍͏numberͰͳ͘UserIdܕͱ͢Δ w
Observable<[number, string, number, number]>ͩͱҙຯෆ໌͕ͩ Observable<[UserId, TimeZone, PageNumber, DisplayCount]> ͱఆٛͰ͖Δ
࣮ྫ export abstract class Value<T> { constructor(protected value: T) {
// } toString(): string { return this.value.toString(); } valueOf(): T { return this.value; } eq(other: Value<T>): boolean { return this.value === other.value; } }
export class TimeZone extends StringValue { TimeZone: ProhibitDuckTyping; static UTC():
TimeZone { return new TimeZone('+0000'); } /** * JST ͷ߹ɺ -540 Λ +0900 ʹม͢Δɻ */ static offsetToIsoTimeZone(offset: number): TimeZone { const min = Math.abs(offset); const isoTimeZone = [ `00${Math.floor(min / 60)}`.slice(-2), `00${min - Math.floor(min / 60) * 60}`.slice(-2), ].join(''); const sign = offset <= 0 ? '+' : '-'; return new TimeZone(`${sign}${isoTimeZone}`); } constructor(protected value: string) { super(value); assert(/^[+-]\d{4}/.test(value), `"${value}" ɺλΠϜκʔϯͷϑΥʔϚοτͰ͋Γ·ͤΜ`); } }
1SPIJCJU%VDL5ZQJOH w Ҋ݅Ͱੜ·ΕͨϫʔΫΞϥϯ υ ʢ5ZQF4DSJQUͷਖ਼ࣜͳٕज़ͷ໊শͰͳ͍ʣ w 5ZQF4DSJQU class A
{ value: string }ͱ class B { value: string }Λ ࠞಉͯ͠ѻ͏ ͜ͱ͕Ͱ͖Δ w ߏ͢ΔϓϩύςΟͷ໊শͱܕͱΈ߹Θ͕ͤಉ͡ͳΒಉ͡ΠϯλϑΣʔεͰ ͋ΔͱΈͳ͞ΕΔ
1SPIJCJU%VDL5ZQJOH w class A { value: string; A: ProhibitDuckTyping; }
class B { value: string; B: ProhibitDuckTyping; } ͷΑ ͏ʹ͢ΕϓϩύςΟ໊͕" #ͰҟͳΔͷͰผͷܕѻ͍Ͱ͖Δ w 1SPIJCJU%VDL5ZQJOH࣮࣭ export type ProhibitDuckTyping = void;