any
と unknown
any
JSON.parse()
String()
unknown
TypeScript では、any
と unknown
はすべての値を含む型です。この章では、それぞれが何であり、何に使用できるかを調べます。
any
と unknown
は TypeScript のいわゆる *最上位型* です。Wikipedia を引用します。
最上位型 […] は 普遍的型で、普遍的スーパークラス とも呼ばれます。その理由は、特定の型システム内の他のすべての型はサブクラスであること […] です。ほとんどの場合、利害関係の型システム内のすべて考えられる [値] を含む型です。
つまり、型を値の集合として見ると (型の詳細については [含まれるコンテンツではありません] を参照してください)、any
と unknown
はすべての値を含む集合です。補足すると、TypeScript には空集合である 最下位型 never
もあります。
any
値に型 any
がある場合、どんなこともそれに対して行うことができます。
function func(value: any) {
// Only allowed for numbers, but they are a subtype of `any`
5 * value;
// Normally the type signature of `value` must contain .propName
.propName;
value
// Normally only allowed for Arrays and types with index signatures
123];
value[ }
あらゆる型が型 any
に割り当て可能
: any;
let storageLocation
= null;
storageLocation = true;
storageLocation = {}; storageLocation
型 any
はあらゆる型に割り当て可能
function func(value: any) {
: null = value;
const a: boolean = value;
const b: object = value;
const c }
any
を使用すると、TypeScript の静的な型システムから通常提供される保護が失われます。したがって、より具体的な型または unknown
が使用できない場合にのみ、最後の手段として使用してください。
JSON.parse()
JSON.parse()
の結果は動的な入力に依存するため、戻り値の型は any
です。(シグネチャからパラメータ reviver
は省略しました)
JSON.parse(text: string): any;
JSON.parse()
は、型 unknown
が存在する前に TypeScript に追加されました。そうでなければ、戻り値の型はおそらく unknown
になっています。
String()
任意の値を文字列に変換する関数 String()
の型シグネチャは次のとおりです。
interface StringConstructor {?: any): string; // call signature
(value// ···
}
unknown
型 unknown
は型 any
の型安全なバージョンです。any
の利用を検討している場合、最初に unknown
を検討してください。
any
では何でもできますが、unknown
ははるかに制限されています。
型 unknown
の値に対して操作を実行する前に、まず次のようにして型を絞り込む必要があります。
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
.toFixed(2);
value
// Type assertion:
as number).toFixed(2); // OK
(value }
等価性
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
* 5;
value
if (value === 123) { // equality
// %inferred-type: 123
;
value
* 5; // OK
value
} }
型ガード:
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
.length;
value
if (typeof value === 'string') { // type guard
// %inferred-type: string
;
value
.length; // OK
value
} }
function func(value: unknown) {
// @ts-expect-error: Object is of type 'unknown'.
.test('abc');
value
assertIsRegExp(value);
// %inferred-type: RegExp
;
value
.test('abc'); // OK
value
}
/** An assertion function */
function assertIsRegExp(arg: unknown): asserts arg is RegExp {
if (! (arg instanceof RegExp)) {
new TypeError('Not a RegExp: ' + arg);
throw
} }