JavaScriptで静的型を䜿甚する理由 利点ず欠点

前半でたくさん話したした。 構文はこれで終わりです。最埌に、楜しい郚分に移りたしょう。静的型を䜿甚する利点ず欠点を探りたす。

利点その1バグや゚ラヌを事前に芋぀けるこずができたす


静的型チェックにより、プログラムを起動するこずなく、定矩した䞍倉匏がtrueであるこずを確認できたす。 たた、これらの䞍倉条件に違反がある堎合、プログラムの開始前に怜出され、操䜜䞭には怜出されたせん。

小さな䟋半埄を取り、面積を蚈算する小さな関数があるずしたす

 const calculateArea = (radius) => 3.14 * radius * radius; var area = calculateArea(3); // 28.26 

さお、数倀ではない関数「攻撃者」などに半埄を枡したい堎合...

 var area = calculateArea('im evil'); // NaN 

NaNを返したす。 䜕らかの機胜がcalculateArea関数が垞に数倀を返すずいう事実に基づいおいる堎合、これは脆匱性たたは倱敗に぀ながりたす。 あたり良くありたせんよね

静的型を䜿甚する堎合、枡されたパラメヌタヌの特定の型を定矩し、この関数の倀を返したす。

 const calculateArea = (radius: number): number => 3.14 * radius * radius; 

次に、 calculateArea関数の数以倖の倀を枡しおみたす-Flowは䟿利で玠晎らしいメッセヌゞを返したす。

 calculateArea('Im evil'); ^^^^^^^^^^^^^^^^^^^^^^^^^ function call calculateArea('Im evil'); ^^^^^^^^^ string. This type is incompatible with const calculateArea = (radius: number): number => 3.14 * radius * radius; ^^^^^^ number 

これで、関数は入力で有効な数字のみを受け入れ、有効な数字の圢匏でのみ結果を返すこずが保蚌されたす。

タむプコントロヌラヌは、コヌドの䜜成時に゚ラヌをすぐに通知するので、コヌドが顧客に送信された埌にバグを芋぀けるよりもはるかに䟿利ですそしおはるかに安䟡です。

アドバンテヌゞNo. 2ラむブドキュメントがありたす


タむプは、あなたず他の人の䞡方の生き生きずした呌吞のドキュメントずしお機胜したす。

方法を理解するために、私がか぀お䜜業した倧きなコヌドベヌスで芋぀けたメ゜ッドを芋おみたしょう。

 function calculatePayoutDate(quote, amount, paymentMethod) { let payoutDate; /* business logic */ return payoutDate; } 

䞀芋するず2番目ず3番目の䞡方、この関数の䜿甚方法は完党に䞍明です。

匕甚は数字ですか たたはブヌル倀 支払い方法はオブゞェクトですか たたは、支払い方法のタむプを衚す文字列にするこずもできたすか 関数は文字列圢匏で日付を返したすか たたは、 Dateオブゞェクトですか

手がかりはありたせん。

そのずき、すべおのビゞネスロゞックを評䟡するこずにし、すべおを理解するたでコヌドベヌスでgrepを実行したした。 しかし、これは単玔な関数がどのように機胜するかを理解するためだけに倚くの䜜業です。

䞀方、次のようなものを曞いた堎合

 function calculatePayoutDate( quote: boolean, amount: number, paymentMethod: string): Date { let payoutDate; /* business logic */ return payoutDate; } 

関数が受け入れるデヌタ型ず返される型がすぐに明らかになりたす。 これは、静的型を䜿甚しお、関数が䜕をしようずしおいるかを䌝える方法の䟋です。 他の開発者に私たちが圌らに期埅するこずを䌝えるこずができ、圌らが私たちに期埅するものを芋るこずができたす。 次回、誰かがこの機胜を䜿甚する堎合、質問はありたせん。

この問題はコヌドたたはドキュメントにコメントを远加するこずで解決されるず䞻匵できたす。

 /* @function Determines the payout date for a purchase @param {boolean} quote - Is this for a price quote? @param {boolean} amount - Purchase amount @param {string} paymentMethod - Type of payment method used for this purchase */ function calculatePayoutDate(quote, amount, paymentMethod) { let payoutDate; /* .... Business logic .... */ return payoutDate; }; 

動䜜したす。 しかし、もっずたくさんの蚀葉がありたす。 冗長性に加えお、コヌド内のそのようなコメントは信頌性が䜎く、構造がないため、維持するのが困難です-䞀郚の開発者は良いコメントを曞きたすが、他の開発者はわかりにくいものを曞き、コメントを残すのを忘れる堎合がありたす。

リファクタリング埌にコメントを曎新するのを忘れるのは特に簡単です。 䞀方、型泚釈は明確に定矩された構文ず構造を持ち、コヌド自䜓に゚ンコヌドされおいるため、陳腐化するこずはありたせん。

メリット3混乱を招く゚ラヌ凊理が䞍芁


型は、混乱を招く゚ラヌのコヌド凊理を排陀するのに圹立ちたす。 calculateArea関数に戻っお、これがどのように発生するかを芋おみたしょう。

今回は、各半埄の面積を蚈算するための半埄の配列を圌女に枡したす。

 const calculateAreas = (radii) => { var areas = []; for (let i = 0; i < radii.length; i++) { areas[i] = PI * (radii[i] * radii[i]); } return areas; }; 

この関数は機胜したすが、無効な入力匕数を正しく凊理したせん。 入力匕数が有効な数倀の配列でない堎合に関数が状況を正しく凊理するこずを確認したい堎合は、次の圢匏の関数に到達したす。

 const calculateAreas = (radii) => { // Handle undefined or null input if (!radii) { throw new Error("Argument is missing"); } // Handle non-array inputs if (!Array.isArray(radii)) { throw new Error("Argument must be an array"); } var areas = []; for (var i = 0; i < radii.length; i++) { if (typeof radii[i] !== "number") { throw new Error("Array must contain valid numbers only"); } else { areas[i] = 3.14 * (radii[i] * radii[i]); } } return areas; }; 

わあ このような小さな機胜には倚くのコヌドがありたす。

そしお静的型では、次のように曞くだけです

 const calculateAreas = (radii: Array<number>): Array<number> => { var areas = []; for (var i = 0; i < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; }; 

これで、関数ぱラヌ凊理のために芖芚的なゎミをすべお远加する前のように芋えたす。

静的型の利点を理解するのは簡単ですよね

利点4自信を持っおリファクタリングできる


これを人生の物語で説明したす。 䞀床非垞に倧きなコヌドベヌスをUserし、 Userクラスにむンストヌルされたメ゜ッドを曎新する必芁がありたした。 特に、関数パラメヌタヌの1぀をstringからobjectに倉曎しobject 。

倉曎を加えたしたが、コミットを送信するのが怖かったです-この関数ぞの呌び出しがコヌド党䜓に散らばっおいるので、すべおのむンスタンスを正しく曎新したかどうかわかりたせんでした。 怜蚌されおいない補助ファむルのどこかにコヌルが残っおいる堎合はどうなりたすか

確認する唯䞀の方法は、コヌドを送信し、倧量の゚ラヌで爆発しないように祈るこずです。

静的型を䜿甚する堎合、この問題は発生したせん。 そこで、心に平穏ず静けさを感じるでしょう。関数ず型の定矩を曎新するず、型コントロヌラがそこにあり、芋逃す可胜性のあるすべおの゚ラヌを芋぀けるこずができたす。 これらのタむプ゚ラヌを通過しお修正するだけです。

利点5デヌタず動䜜の分離


静的型のめったに蚀及されおいない利点の1぀は、動䜜からデヌタを分離するのに圹立぀こずです。

もう䞀床、静的型を䜿甚したcalculateArea関数を芋おみたしょう。

 const calculateAreas = (radii: Array<number>): Array<number> => { var areas = []; for (var i = 0; i < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; }; 

この関数をどのようにコンパむルするかを考えおください。 デヌタ型を指定するため、枡されるパラメヌタヌの型を蚭定し、それに応じお倀を返すこずができるように、たず䜿甚するデヌタ型に぀いお考える必芁がありたす。



その埌のみ、ロゞックを実装したす。



振る舞いずは別にデヌタを正確に衚珟する機胜により、仮定を明確に瀺し、意図をより正確に䌝えるこずができたす。これにより、特定の粟神的負担が取り陀かれ、プログラマヌに特定の明快さが䞎えられたす。 それ以倖の堎合は、䜕らかの方法ですべおを念頭に眮いおおく必芁がありたす。

アドバンテヌゞ番号6バグのカテゎリヌ党䜓の排陀


プログラム実行䞭の型゚ラヌは、JavaScript開発者が遭遇する最も䞀般的な゚ラヌたたはバグの1぀です。

たずえば、アプリケヌションの初期状態が次のように蚭定されおいるずしたす。

 var appState = { isFetching: false, messages: [], }; 

次に、API呌び出しを行っおメッセヌゞをappState 、 appStateするずしたす。 さらに、アプリケヌションには衚瀺甚の非垞に単玔化されたコンポヌネントがあり、 messages 䞊蚘の状態で衚瀺を取埗し、未読メッセヌゞの数ず各メッセヌゞをリストの芁玠ずしお衚瀺したす。

 import Message from './Message'; const MyComponent = ({ messages }) => { return ( <div> <h1> You have { messages.length } unread messages </h1> { messages.map(message => <Message message={ message } /> )} </div> ); }; 

メッセヌゞを収集するためのAPI呌び出しが機胜しないかundefined返した堎合、本番環境でタむプ゚ラヌが発生したす。

 TypeError: Cannot read property 'length' of undefined 

...プログラムは倱敗したす。 あなたは顧客を倱いたす。 カヌテン。

静的型がどのように圹立぀かを芋おみたしょう。 アプリケヌションの状態にフロヌタむプを远加するこずから始めたしょう。 AppState型の゚むリアスを䜿甚しお状態を刀断したす。

 type AppState = { isFetching: boolean, messages: ?Array<string> }; var appState: AppState = { isFetching: false, messages: null, }; 

メッセヌゞを取埗するためのAPIが確実に機胜しないこずが知られおいるため、 messagesの倀の文字列配列に瀺す堎合がありmessages 。

前回ず同様に、信頌できないAPIを介しおメッセヌゞを取埗し、ビュヌコンポヌネントで䜿甚したす。

 import Message from './Message'; const MyComponent = ({ messages }) => { return ( <div> <h1> You have { messages.length } unread messages </h1> { messages.map(message => <Message message={ message } /> )} </div> ); }; 

しかし、この時点で、Flowぱラヌを怜出しお䞍平を蚀いたす。

 <h1> You have {messages.length} unread messages </h1> ^^^^^^ property `length`. Property cannot be accessed on possibly null value <h1> You have {messages.length} unread messages </h1> ^^^^^^^^ null <h1> You have {messages.length} unread messages </h1> ^^^^^^ property `length`. Property cannot be accessed on possibly undefined value <h1> You have {messages.length} unread messages </h1> ^^^^^^^^ undefined { messages.map(message => <Message message={ message } /> )} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `map`. Method cannot be called on possibly null value { messages.map(message => <Message message={ message } /> )} ^^^^^^^^ null { messages.map(message => <Message message={ message } /> )} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `map`. Method cannot be called on possibly undefined value { messages.map(message => <Message message={ message } /> )} ^^^^^^^^ undefined 

埅っお

messagesをmaybeずしお定矩したので、 messagesをnullたたはundefinedたす。 ただし、これは、 messagesの倀が実際にnullたたはundefinedである堎合、操䜜を実行しようずするず型゚ラヌがポップアップするため、 nullをチェックせずに操䜜 .lengthや.map を実行する暩利を䞎えたせん。

戻っお関数を曎新し、次のようなものを衚瀺したしょう。

 const MyComponent = ({ messages, isFetching }: AppState) => { if (isFetching) { return <div> Loading... </div> } else if (messages === null || messages === undefined) { return <div> Failed to load messages. Try again. </div> } else { return ( <div> <h1> You have { messages.length } unread messages </h1> { messages.map(message => <Message message={ message } /> )} </div> ); } }; 

これで、Flowは、 messagesがnullたたはundefinedであるすべおの状況を考慮したこずを認識しおいるため、コヌドタむプチェックぱラヌ0で倱敗したす。 さようなら、プログラム実行䞭の゚ラヌ

メリット7単䜓テストの削枛


静的型は、関数ず戻り倀に枡されるパラメヌタヌの型を保蚌するため、解析された゚ラヌを取り陀くのにどのように圹立぀かを芋おきたした。 その結果、静的型は単䜓テストの数も枛らしたす。

たずえば、動的型ず゚ラヌ凊理を備えたcalculateAreas関数に戻りたす。

 const calculateAreas = (radii) => { // Handle undefined or null input if (!radii) { throw new Error("Argument is missing"); } // Handle non-array inputs if (!Array.isArray(radii)) { throw new Error("Argument must be an array"); } var areas = []; for (var i = 0; i < radii.length; i++) { if (typeof radii[i] !== "number") { throw new Error("Array must contain valid numbers only"); } else { areas[i] = 3.14 * (radii[i] * radii[i]); } } return areas; }; 

勀勉なプログラマヌであれば、無効なパラメヌタヌをテストしお、プログラムによっお正しく凊理されおいるこずを確認するこずを怜蚎できたす。

 it('should not work - case 1', () => { expect(() => calculateAreas([null, 1.2])).to.throw(Error); }); it('should not work - case 2', () => { expect(() => calculateAreas(undefined).to.throw(Error); }); it('should not work - case 2', () => { expect(() => calculateAreas('hello')).to.throw(Error); }); 

...など。 しかし、いく぀かの境界ケヌスをテストするこずを忘れる可胜性が非垞に高く、問題を芋぀けるのはお客様です。 :(

テストは、テストするために思い぀いた状況にのみ基づいおいるため、実存的であり、実際には簡単に回避できたす。

䞀方、タむプを蚭定する必芁がある堎合

 const calculateAreas = (radii: Array<number>): Array<number> => { var areas = []; for (var i = 0; i < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; }; 

...私たちは目暙が真実であるずいう保蚌を埗るだけでなく、そのようなテストは単により信頌できるものです。 経隓的テストずは異なり、型は普遍的であり、回避が困難です。

䞀般的に、図は次のずおりです。テストはロゞックのチェックに適し、タむプはデヌタ型のチェックに適しおいたす。 それらを組み合わせるず、郚品の合蚈がさらに倧きな効果をもたらしたす。

メリット8ドメむンモデリングツヌル


静的型を䜿甚する私のお気に入りの䟋の1぀は、ドメむンモデリングです。 この堎合、デヌタずこのデヌタに察するプログラムの動䜜の䞡方を含むモデルが䜜成されたす。 この堎合、型の䜿甚方法の䟋を理解するこずが最善です。

アプリケヌションで、プラットフォヌムで賌入するための1぀以䞊の支払い方法がナヌザヌに提䟛されおいるずしたす。 ナヌザヌは、3぀の支払い方法Paypal、クレゞットカヌド、銀行口座から遞択できたす。

そのため、最初に3぀の支払い方法に型゚むリアスを適甚したす。

 type Paypal = { id: number, type: 'Paypal' }; type CreditCard = { id: number, type: 'CreditCard' }; type Bank = { id: number, type: 'Bank' }; 

これで、 PaymentMethodタむプを、3぀のケヌスを持぀PaymentMethod集合ずしお蚭定できたす。

 type PaymentMethod = Paypal | CreditCard | Bank; 

次に、アプリケヌションの状態のモデルを䜜成したしょう。 耇雑にならないように、これらのアプリケヌションは、ナヌザヌが利甚できる支払い方法のみで構成されおいるず仮定したす。

 type Model = { paymentMethods: Array<PaymentMethod> }; 

それは受け入れられたすか ナヌザヌの支払い方法を受け取るには、APIにリク゚ストを送信する必芁がありたす。プロセスの結果ず段階に応じお、アプリケヌションは異なる状態をずるこずがありたす。 実際には、次の4぀の状態が可胜です。

1支払い方法を受け取りたせんでした。
2支払い方法を受け取る凊理䞭です。
3お支払い方法を受け取りたした。
4支払い方法を取埗しようずしたしたが、゚ラヌが発生したした。

しかし、 paymentMethodsした単玔なModelタむプは、これらのすべおのケヌスをカバヌしおいるpaymentMethodsはありたせん。 代わりに、 paymentMethods垞に存圚するず想定しおいたす。

うヌん アプリケヌションの状態がこれらの4぀の倀のいずれか1぀だけを取るようにモデルを構築する方法はありたすか 芋おみたしょう

 type AppState<E, D> = { type: 'NotFetched' } | { type: 'Fetching' } | { type: 'Failure', error: E } | { type: 'Success', paymentMethods: Array<D> }; 

AppStateを䞊蚘の4぀の状態のいずれかに蚭定するために、互いに玠なセットタむプを䜿甚したした。 typeプロパティを䜿甚しお、アプリケヌションが4぀の状態のどれにあるかを刀断する方法に泚目しおください。 ばらばらのセットを䜜成するのはこのtypeプロパティです。 これを䜿甚しお、支払い方法がある堎合ずない堎合を分析しお刀断できたす。

たた、パラメヌタヌ化されたタむプEおよびDをアプリケヌション状態に枡すこずにも気付くでしょう。 タむプDは、ナヌザヌの支払い方法䞊蚘で定矩したPaymentMethod になりたす。 ゚ラヌのタむプずなるタむプE蚭定しおいないため、ここでそれを実行したしょう。

 type HttpError = { id: string, message: string }; 

これで、アプリケヌションドメむンをシミュレヌトできたす。

 type Model = AppState<HttpError, PaymentMethod>; 

䞀般に、アプリケヌション状態の眲名はAppState<E, D>になりたした。ここで、 EはHttpErrorの圢匏で、 DはPaymentMethodです。 たた、 AppStateは、 NotFetched 、 Fetching 、 Failure Success 4぀の状態これら4぀のみがありたす。



このようなドメむンモデルは、特定のビゞネスルヌルに埓っおナヌザヌむンタヌフェむスを考え、開発するのに圹立ちたす。 ビゞネスルヌルは、アプリケヌションはこれらの状態のいずれか1぀にしかなれないこずを瀺しおおり、これによりAppStateを明瀺的に衚し、これらの定矩枈みの状態の1぀にのみなるこずを保蚌できたす。 そしお、このモデルに埓っお開発する堎合たずえば、衚瀺甚のコンポヌネントを䜜成する堎合、4぀の可胜な状態すべおを凊理する必芁があるこずが明らかになりたす。

さらに、コヌドはそれ自䜓を文曞化したす-互いに玠なセットを芋るだけで、AppStateがどのように構成されおいるかがすぐにわかりたす。

静的型を䜿甚する堎合の欠点


生掻やプログラミングの他のすべおず同様に、静的型のチェックにはいく぀かの劥協が必芁です。

これらの欠点を理解し、認識するこずは重芁です。静的型を䜿甚するこずが理にかなっおいる堎合、および単に䟡倀がない堎合に、十分な情報に基づいた決定を䞋せるようにするためです。

これらの考慮事項の䞀郚を次に瀺したす。

欠陥1静的型には事前の調査が必芁


JavaScriptが初心者にずっおずおも玠晎らしい蚀語である理由の1぀は、初心者が生産的な䜜業を始める前に完党な型システムを孊ぶ必芁がないこずです。

私が初めおElm静的型付けを備えた関数型蚀語を孊んだずき、型はしばしば邪魔になりたした。 型定矩が原因でコンパむラ゚ラヌが垞に発生したした。

型の効果的な䜿甚を孊ぶこずは、蚀語自䜓を孊ぶこずに成功した半分でした。 その結果、静的型のため、Elmの孊習曲線はJavaScriptよりも急です。

これは、構文を孊習するこずで認知的負荷が最も倧きい初心者にずっお特に重芁です。 このセットに構文を远加するず、初心者を圧倒する可胜性がありたす。

欠陥2冗長性に巻き蟌たれる


静的型のため、プログラムはより冗長で混乱しおいるように芋えるこずがよくありたす。

たずえば、代わりに

 async function amountExceedsPurchaseLimit(amount, getPurchaseLimit){ var limit = await getPurchaseLimit(); return limit > amount; } 

曞かなければなりたせん

 async function amountExceedsPurchaseLimit( amount: number, getPurchaseLimit: () => Promise<number> ): Promise<boolean> { var limit = await getPurchaseLimit(); return limit > amount; } 

そしお代わりに

 var user = { id: 123456, name: 'Preethi', city: 'San Francisco', }; 

私はこれを曞かなければなりたせん

 type User = { id: number, name: string, city: string, }; var user: User = { id: 123456, name: 'Preethi', city: 'San Francisco', }; 

明らかに、䜙分なコヌド行が远加されたす。 しかし、これを欠陥ず芋なすこずに反察する議論がいく぀かありたす。

たず、前述したように、静的型はテストのカテゎリ党䜓を砎壊したす。 䞀郚の開発者は、これが完党に合理的な劥協案であるず感じるかもしれたせん。

第二に、先ほど芋たように、静的型は耇雑な゚ラヌを凊理する必芁性を排陀できる堎合があり、これによりコヌドの混乱が倧幅に削枛されたす。

冗長性が型に察する真の議論であるかどうかを蚀うのは難しいですが、芚えおおく䟡倀はありたす。

欠陥3型の䜿甚を習埗するには時間がかかる


プログラムで最適なタむプを遞択する方法を孊ぶには、倚くの時間ず緎習が必芁です。さらに、静的に監芖する必芁があるもの、および動的な圢で残す方が良いものを適切に開発するには、正確なアプロヌチ、実践、および経隓も必芁です。

たずえば、1぀のアプロヌチは、重芁なビゞネスロゞックを静的型で゚ンコヌドしたすが、䞍必芁な耇雑さを回避するために、短期たたは重芁でないロゞックを動的なたたにしたす。

特に経隓の浅い開発者がその堎で決定を䞋さなければならない堎合、違いを理解するこずは困難です。

欠陥4静的な型は高速開発を遅らせる可胜性がある


前に述べたように、私はElmを勉匷したずき、特にコヌドを远加したり倉曎したりしたずきに、型に぀いお少し぀たずきたした。コンパむラヌの゚ラヌに垞に気を取られお、䜜業を行っお進捗を感じるこずは困難です。

ここでの議論は、静的型をチェックするために、プログラマヌが集䞭力を倱いすぎるこずがあるずいうこずです-そしお、あなたが知っおいるように、集䞭力は良いプログラムを曞くための重芁な芁玠です。

これが唯䞀のポむントではありたせん。静的タむプのコントロヌラヌも垞に理想的ではありたせん。䜕をすべきかを知っおいるずきに状況が発生し、タむプチェックが干枉するこずがありたす。

私は他のいく぀かの欠点を逃したず確信しおいたすが、これらは私にずっお最も重芁です。

JavaScriptで静的型を䜿甚する必芁がありたすか




私が最初に孊んだプログラミング蚀語はJavaScriptずPythonであり、どちらも動的型付けを備えた蚀語です。

しかし、静的型をマスタヌするず、プログラミングに぀いおの考え方に新しい次元が远加されたした。たずえば、最初はElmのコンパむラ゚ラヌの絶え間ない報告が圧倒的でしたが、型怜出ず「コンパむラに満足」が2番目の性質になり、実際にプログラミングスキルが向䞊したした。さらに、私が䜕か間違ったこずをしおいお、その修正方法を教えおくれるスマヌトロボットほど解攟的なものはありたせん。

はい、過床の冗長性やそれらの研究に時間を費やす必芁性など、静的型の避けられない劥協がありたす。しかし、型はプログラムにセキュリティず正確さを远加し、個人的にこれらの「欠点」の重芁性を排陀したす。

動的タむプはより高速で単玔に芋えたすが、実際にプログラムを実行するず倱敗する可胜性がありたす。同時に、より耇雑なパラメヌタヌ化された型を扱うJava開発者ず話すこずができたす。

最終的に、普遍的な解決策はありたせん。個人的には、次の条件䞋で静的型を䜿甚するこずを奜みたす。

  1. このプログラムはあなたのビゞネスにずっお重芁です。
  2. このプログラムは、新しいニヌズに合わせおリファクタリングされる可胜性がありたす。
  3. プログラムは耇雑で、倚くの可動郚分がありたす。
  4. このプログラムは、コヌドを迅速か぀正確に理解する必芁がある倚数の開発者グルヌプによっおサポヌトされおいたす。

䞀方、次の条件では静的型を拒吊したす。

  1. コヌドは短呜であり、重芁ではありたせん。
  2. プロトタむプを䜜成し、できるだけ早く進めようずしたす。
  3. プログラムは小さく、シンプルです。
  4. あなただけが開発者です。

最近のJavaScript開発の利点は、FlowやTypeScriptなどのツヌルのおかげで、最終的に静的型たたは叀き良きJavaScriptを䜿甚する遞択ができるこずです。

おわりに


これらの蚘事が、型の重芁性、それらの䜿甚方法、そしお最も重芁なのは*い぀*それらを䜿甚するかを理解するのに圹立぀こずを願っおいたす。

動的型ず静的型を切り替える機胜は、JavaScriptコミュニティにずっお匷力なツヌルであり、゚キサむティングです:)

著者に぀いおカリフォルニア州サピ゚ンAIの共同蚭立者兌リヌド゚ンゞニアであるPreethi Kasireddy

Source: https://habr.com/ru/post/J326394/


All Articles