回答:
詳細についてunknown
は、PRまたはRCの発表で確認できますが、その要点は次のとおりです。
[..]どれがタイプセーフかは不明です。unknownは、unknownに割り当て可能ですが、unknownは、それ自体と型アサーションまたは制御フローベースのナローイングなしでは割り当てられません。同様に、未知のものに対する操作は、最初に特定のタイプにアサートまたはナローイングしない限り許可されません。
いくつかの例:
let vAny: any = 10; // We can assign anthing to any
let vUnknown: unknown = 10; // We can assign anthing to unknown just like any
let s1: string = vAny; // Any is assigable to anything
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)
vAny.method(); // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable
推奨される使用法は次のとおりです。
TypeScriptで最小機能の型を記述したい場合がよくあります。これは、「これは任意の値になる可能性があるため、使用する前になんらかのチェックを実行する必要がある」ことを通知するAPIに役立ちます。これにより、ユーザーは戻り値を安全にイントロスペクトする必要があります。
unknown
とobject
私はcontravarianceと共分散の面であなたがで取得しているかを見ると思いますが、@nawfal(例えば、任意のオブジェクト型に代入されるobject
ためものの、unknown
任意のオブジェクトまたはプリミティブ割り当てることもできます-同様にunknown
、any
または自体object
に割り当てることができますdynamic
。TSのドキュメントを参照してください理由サイドノートでは、私は不明だunknown
それは本当にすべてのタイプが含まれていないため、トップ型として_(ツ)_ /¯
unknownとanyの違いは次のとおりです。
と同様に
any
、任意の値を割り当てることができunknown
ます。ただし、とは異なりany
、typeの値のプロパティにアクセスしたり、unknown
それらを呼び出したり構築したりすることはできません。さらに、タイプの値はunknown
、unknown
またはにのみ割り当てることができますany
。
あなたが使用する必要があるときのあなたの質問に答えるためにunknown
オーバーany
:
これは、「これは任意の値になる可能性があるため、使用する前になんらかのチェックを行う必要がある」ことを通知するAPIに役立ちます。これにより、ユーザーは戻り値を安全にイントロスペクトする必要があります。
型の変数の型チェックの例と詳細な説明については、TypeScript 3.0の発表をunknown
ご覧ください。
any
タイプ:any
タイプは、すべての可能なJS値を表します。すべてのタイプはtypeに割り当て可能any
です。したがって、型any
は型システムのユニバーサルスーパータイプです。TSコンパイラーは、入力された値に対する任意の操作を許可しますany
。例えば:
let myVar: any;
myVar[0];
myVar();
myVar.length;
new myVar();
多くの場合、これはTSコンパイラーには寛大すぎます。つまり、実行時エラーが発生することがわかっている可能性のある操作を許可します。
unknown
タイプ:unknown
タイプは(同じように表しany
、すべての可能なJS値)。すべてのタイプはtypeに割り当て可能unknown
です。したがって、型unknown
は型システムのもう1つのユニバーサルスーパータイプです(と一緒にany
)。ただし、TSコンパイラは typedされた値に対する操作を許可しませんunknown
。さらに、unknown
タイプはタイプにのみ割り当て可能any
です。例はこれを明確にします:
let myVar: unknown;
let myVar1: unknown = myVar; // No error
let myVar2: any = myVar; // No error
let myVar3: boolean = myVar; // Type 'unknown' is not assignable to type 'boolean'
// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
any
のようなものであるdynamic
とunknown
のようなものですobject
。unknown
型安全なだけなので、私は好きです。名前を混乱させます。