記事一覧:
より良い読書体験のために、あなたが見ることができます。
活字体への新たな一年前は、私はそれがコードの作業負荷を増加させたと感じました。たくさんのことを書く。周りに実行するための特定の種類を見つけるために、また、多くの場合、エラーを第三のライブラリを導入します。
しかし、今私が言いたい:本当に甘いです。
私たちは、多くの場合、特に低Tucaoその他の保守性は、常に他の人が書き込みノートにイニシアチブを取ることができるようにしたいが、書き込みコメントはどのような方法で制約される可能性がなかった。これは単に素晴らしいです、活字体とコメントの最高の種類、である、大幅に向上させることができますコードの保守。
サードパーティのライブラリのタイプに関連する問題に対処する方法A.
型定義Typesciptサードパーティのライブラリは、私たちの入力を呼び出すように制約はなく、私たちのために文書を提供していないだけを提供する。NPMの範囲の種類の今、サードパーティ製の型定義を、型定義が正しいことを確認することは困難である。すべての利用を確保することは困難ですサードパーティのライブラリは、型定義を持っています。
だから、これは適切に活字体サードパーティ製のライブラリを使用するか、どのように未知のプロセスの完全なのですか?
ここでは4つの一般的なシナリオのソリューションを対応するだけでなく、機能していないが、次のとおりです。
-
ライブラリ自体は、独自の型定義をしません
-
ライブラリは、型定義を持っていない、と何の関連@typeはありません
-
間違った型宣言ライブラリ
-
型宣言エラー
1.ライブラリ自体は、独自の型定義をしません
タイプライブラリに関連しない検索。栗について
時の初期変換サポートtypescriptです反応するであろう、おそらく多くの人がmodule.hotエラーが発生します。この時点で唯一のライブラリをすることができ、対応するタイプをインストールする必要があります。
種類/ WebPACKの-ENV @インストール
2.ライブラリ自体は何の型定義を持っていない、と何の関連@type
それは、自分のの文にすることができます。ちょうど栗のために。
宣言モジュール「lodash」
3.タイプライブラリが正しくない宣言です
-
広報、問題を述べた公式型定義の問題の解決を促進
-
拡張オリジナルタイプをインポートまたはマージ能力を通って延びています
-
損失や信頼性の欠如のタイプに耐えます
-
使用// @無視tsが、無視します
4.文のエラー
-
真、Quxianjiuguo: "skipLibCheck" のcompilerOptionsを追加します。
第二に巧妙な収縮解決するには、次のリストでエラーの解決策のいくつかの一般的なタイプ:
-
型アサーション
-
保護の種類ガードtypeof演算でinstanceofはリテラルのタイプ
-
デュアルアサーション
1、アサーションのタイプ
アサーションの種類は明らかに詳細に活字体値の種類を伝えることができ、
いくつかのシーンでは、我々はtypescriptですと矛盾が型を推論しても、非常に必ずそれのタイプです。私たちは、アサーションのそのタイプを使用することができます。
構文は次のとおりです。
<タイプ>の値
ジェネリック医薬品と<>簡単紛争、構文を反応するので、//タイプなどの値は、この構文をお勧めします
たとえば、次のコード、パディング値は、文字列とすることができる配列内のコードで書かれているが、さらに(数であることができる)、我々は明らかに知っている、パディング数のparseInt型に変換されますが、タイプがまだエラーが定義されています。
関数padLeft(値:文字列、パディング:文字列|番号){
//报错:演算子「+」に適用することはできません
//タイプ「という文字列| 数」と 『番号』
リターン・アレイ(パディング+ 1).join(」「)+値。
}
解像度は、型アサーションを使用した。私は、必ずそれは数の種類があるtypescriptです教えてエラーを無視するためにここにいます。
関数padLeft(値:文字列、パディング:文字列|番号){
//通常の
リターンアレイ.join(」「)+値(数+ 1とパディング)。
}
この場合を、以下の場合でも、我々はそれとして、より多くのことを書くのか?
関数padLeft(値:文字列、パディング:文字列|番号){
console.log(数として(パディング)+ 3)。
console.log(数として(パディング)+ 2)。
console.log(数として(パディング)+ 5)。
リターン・アレイ(数として(パディング)+ 1).join(」「)+値;
}
2、ガードの種類
道を守るにはいくつかの種類がありますが、簡単な要約を以下の
-
typeof演算:「番号」、「文字列」、「ブール」または「記号」4種類を決定するため。
-
instanceofの:クラスのインスタンスかどうかを決定するため
-
中:プロパティ/メソッドを決定するためのオブジェクトに属し
-
保護のリテラルタイプ
次の例にtypeof演算式ガードを使用して、数タイプ|上記の例では、文字列であります
関数padLeft(値:文字列、パディング:文字列|番号){
IF(typeof演算パディング=== '番号'){
console.log(パディング+ 3); //ノーマル
console.log(パディング+ 2); //ノーマル
console.log(パディング+ 5); //ノーマル
//通常の
リターン・アレイ(パディング+ 1).join(」「)値。
}
IF(typeof演算パディング=== '列'){
戻りパディング+値。
}
}
多くのコードとして保存アサーション比べると種類は、ほかのtypeof演算では、我々は、脳卒中の例以下のいくつかの方法を、持っています。
-
instanceofの:クラスのインスタンスかどうかを決定するため
クラスマン{
ハンサム=「ハンサム」;
}
クラス女{
美しい=「美しいです」;
}
機能人間(引数:男|女){
IF(マンinstanceofの引数){
console.log(arg.handsome)。
console.log(arg.beautiful)。//エラー
} そうしないと {
//この1は、ある女性です
console.log(arg.beautiful)。
}
}
-
中:プロパティ/メソッドを決定するためのオブジェクトに属し
インターフェースB {
B:文字列。
}
インターフェースA {
文字列;
}
関数foo(X:A | B){
IF( 'A' におけるX){
XAを返します。
}
XB返します。
}
-
保護のリテラルタイプ
いくつかのシーンは、instanceofは、typeofの面倒をで使用しています。この時間は、あなた自身のリテラルタイプを構築することができます。
入力男= {
ハンサム「ハンサム」;
タイプ:「男」;
}。
入力女= {
美しい「美しいです」;
タイプ:「女」;
}。
機能人間(引数:男|女){
IF(arg.type === '男性'){
console.log(arg.handsome)。
console.log(arg.beautiful)。//エラー
} そうしないと {
//この1は、ある女性です
console.log(arg.beautiful)。
}
}
3、ダブルアサーション
時間としてアサーション条件がないわけではないので、時には、エラーとして使用する。これは、S型がタイプT、Sのサブセットであるか、T型がときタイプのサブセットである場合にのみ、S成功アサーションT.であること
だから問題を解決するために暴力にしたい、このような状況の中で、あなたは二重のアサーションを使用することができます。
関数ハンドラ(イベント:イベント){
CONST要素=のHTMLElementとしてイベント。
//エラー: 'イベント' 和 'のHTMLElement'
いずれも、別に割り当てることはできません
}
あなたはまだそのタイプを使用する場合は、二重のアサーションを使用することができます。最初の主張は、いずれかのすべてのタイプと互換性を持つようにします
関数ハンドラ(イベント:イベント){
CONST要素=のHTMLElementとして(任意などのイベント)。
//通常の
}
III。最新の機能に最適化されたコードのためのtypescriptですjsのサポートを使用して
1.オプションオプションチェーンチェーン
?)(X = FOO .bar.bazをしましょう。
次のように活字体が実装さ:
そこ_E;
X =(_a = FOO)===ヌル||ましょう
_a === 0無効?空0:_a.bar.baz();
この機能を使用して、我々は吐き気書き込みの多く&& AB && ABC、このコードを保存することができます
2.ヌルユナイテッドNullish合体
X = FOOを聞かせて?22 '';
次のように活字体が実装さ:
聞かせてX =(fooの!== nullの&& fooの!==無効0?
FOO '22');
先進型typescriptですとハンドルデータにIV。賢いの柔軟性はいくつかの素晴らしいツールが姿を次の関数を提供します
-
タイプインデックス
上記のユーティリティ機能を実現するために、我々は次の構文を理解する必要があります。
keyof:タイプのキーの値を取得
拡張:一般的な内部の制約を
T [K]:対応するオブジェクトT Kの要素タイプを取得
入力部分<T> = {
[Pでkeyof T]?:T [P]
}
小道具を使用して、そして時にはすべての属性の場合は、プロパティの書き込みA場合は?、繰り返しの多いオプションです。この時間は直接部分<状態>使用することができます
特に柔軟なツール。鍵として最初の着信オブジェクトの一般的な値は、第二の着信オブジェクトの属性値を記録します。
レコードを入力<Kが延びている文字列、T> = {
[KにおけるP]:T。
}
私たちは、このオブジェクトを見てここでは、どのようにそれは、TSと宣言するのでしょうか?
AnimalMap CONST = {
猫:{名: '猫'、タイトル: '猫'}、
犬:{名: '狗'、タイトル: '犬'}、
frog: { name: '蛙', title: 'wa' },
}。
この時点で、録音を使用することができます。
型AnimalType = '猫' | 「犬」| 'カエル';
インターフェースAnimalDescription {
名前:文字列、タイトル:文字列
}
constのAnimalMap:
レコード<AnimalType、AnimalDescription> = {
猫:{名: '猫'、タイトル: '猫'}、
犬:{名: '狗'、タイトル: '犬'}、
frog: { name: '蛙', title: 'wa' },
}。
-
決して、条件タイプの設定
上記の構文に加えて。我々はまた、条件より柔軟な型定義の種類を組み合わせるように構成することができません。
構文:
タイプの値が表示されることはありません:決して
// TはUのサブタイプである場合、Xと、Yそうでない場合に返され
構造的な条件は、タイプ:?TはU Xを拡張:Y
<T、U> = TはUを拡張除外タイプ?決して:T。
等価@:タイプA = ''
タイプA = < 'X' 除外| ''、 'X' | 'Y' | 'Z'>
-
より簡潔な修飾子: - と+
これは、直接削除することができますか?すべてのオブジェクトは、プロパティの転送量になります。
入力必須<T> = {[keyofにおけるP T] - ?:T [P]}。
//読み取り専用削除
タイプMutableRequired <T> = {
-readonly [T keyofにおけるP] T [P]
}。
-
INFER:では、型変数を推論する条件文を拡張します。
約束のタイプに固有の値を取得する//必要性
タイプPromiseVal <P> =
Pは<INNER推論>約束を拡張しますか?INNER:P。
PSTR =プロミス<string>を入力します。
//テスト===文字列
型テスト= PromiseVal <PSTR>。
V.は、タイプ&インターフェースを識別します
主要なタイプライブラリでは、タイプおよびインターフェイスのすべての種類が表示されます。しかし、多くの人々が実際にそれらの違いを知りません。
公式サイトの定義は以下のとおりです。
句を拡張または実装にインタフェースが挙げられるが、オブジェクト型のリテラルの型エイリアスができません。
インターフェイスは、複数のマージされた宣言を持つことができますが、オブジェクト型のリテラルの型の別名はできません。
それらの二つの違いから見た図:
提案:あなたはタイプを使用することができない場合にのみ使用インタフェースの実装は、インタフェースを使用しています。
为了更好的阅读体验, 《typescrit 最佳实践》
- 欢迎关注「前端加加」,认真学前端,做个有专业的技术人...