回答:
詳細について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型安全なだけなので、私は好きです。名前を混乱させます。