TypeScript -- any、unknown、Object、object、{}

191 阅读5分钟

Any 类型

  1. 没有强制限定哪种类型,随时切换类型都可以 我们可以对 any 进行任何操作,不需要检查类型
let anys:any = 123
anys = '123'
anys = true
  1. 声明变量的时候没有指定任意类型默认为any
let anys;
anys = '123'
anys = true
  1. 弊端如果使用any 就失去了TS类型检测的作用

unknown 类型

  1. TypeScript 3.0中引入的 unknown 类型也被认为是 top type ,但它更安全。与 any 一样,所有类型都可以分配给unknown

  2. unknown类型比any更加严格当你要使用any 的时候可以尝试使用unknow

//unknown 可以定义任何类型的值
let value: unknown;
 
value = true;             // OK
value = 42;               // OK
value = "Hello World";    // OK
value = [];               // OK
value = {};               // OK
value = null;             // OK
value = undefined;        // OK
value = Symbol("type");   // OK
 
 
 
//这样写会报错unknow类型不能作为子类型只能作为父类型 any可以作为父类型和子类型
//unknown类型不能赋值给其他类型
let names:unknown = '123'
let names2:string = names
 
//这样就没问题 any类型是可以的
let names:any = '123'
let names2:string = names   
 
//unknown可赋值对象只有unknown 和 any
let bbb:unknown = '123'
let aaa:any= '456'
 
aaa = bbb




// 这样写会报错,
> 
> unknown没有办法读任何属性 方法也不可以调用
let obj:unknown = {"key":trueopen:()=>123}
console.log(obj.key);
obj.open();

// any可以
let obj1:any = {"key":trueopen:()=>123}
console.log(obj1.key);
obj1.open();

unknown类型不能赋值给其他类型

unknown可赋值对象只有unknown 和 any

unknown没有办法读任何属性 方法也不可以调用

类型等级

  1. any unknown
  2. Object
  3. Number String Boolean
  4. number string boolean
  5. 字面值
  6. never

按照顺序,第一个类型可以包含2,3,4,5,6类型,第二个类型可以包含3,4,5,6类型,以此类推

Numbernumber区别

在TypeScript中,Numbernumber都可以用来表示数字类型,但它们的用途和行为有一些不同。

number是一个基本数据类型,用于表示所有数字(包括整数、浮点数等)。当你需要一个数字变量时,通常应该使用number类型。例如:

let x: number = 5;

Number是一个全局对象,它是JavaScript中所有数字值的构造函数。你可以使用Number对象来执行更复杂的操作,如将其他类型的值转换为数字,或检查一个值是否是有限的数字。例如:

let x: Number = Number("5");  // 将字符串转换为数字
let y: boolean = Number.isFinite(1000);  // 检查一个值是否是有限的数字

然而,在TypeScript中,Number也可以用作类型,表示任何可以被Number对象包装的值。这包括所有number值,以及Number对象。但是,除非你有特殊的需要,否则通常应该使用number类型,因为它更简单,更符合TypeScript的类型安全性。

总的来说,number和Number在TypeScript中都可以用来表示数字,但number是基本数据类型,而Number是全局对象。在大多数情况下,你应该使用number类型。

为什么应该使用number

在TypeScript(以及JavaScript)中,通常推荐使用number(小写n)而不是Number(大写N)来处理数字,主要有以下几个原因:

  • 性能:number是JavaScript的原始数据类型,而Number是一个对象。使用number类型的操作通常比使用Number对象更快,因为原始类型不需要额外的对象包装和解包装过程。

  • 简洁性:number类型更简洁,更易于理解。当你看到一个类型为number的变量时,你可以立即知道它是一个数字,而不需要考虑它可能是一个Number对象。

  • 类型安全:在TypeScript中,number类型提供了更强的类型安全。如果你尝试将非数字值赋给一个number类型的变量,TypeScript会给出编译错误。而Number对象可以包含任何值,包括非数字值,这可能导致运行时错误。

  • 一致性:在JavaScript和TypeScript的社区中,使用number类型是最常见的做法。坚持使用number可以使你的代码更一致,更易于其他开发者理解。

总的来说,虽然Number对象提供了一些额外的功能,但在大多数情况下,使用number类型会更简单,更高效,更安全。

objectObject 以及{}

Object

Object包含所有的类型(基础类型和引用类型),所以它可以指向任何一个值

let a:Object = 123;
let a:Object = '123';
let a:Object = [];
let a:Object = {};
let a:Object = ()=>123;

Object类型是所有Object类的实例的类型。这个类型是跟原型链有关的原型链顶层就是Object,所以值类型和引用类型最终都指向Object,所以他包含所有类型。

object

object 代表所有非值类型的类型,例如 数组 对象 函数等,常用于泛型约束

let a:object = 123';// 错误 原始类型
let a1:object = 123;//错误 原始类型
let a2:object = false;//错误 原始类型
let a3:object = [];//正确
let a4:object = {};//正确
let a5:object = ()=>123;//正确

{}

看起来很别扭的一个东西 你可以把他理解成new Object 就和第一个Object基本一样,包含所有类型

let a:{} = 123;
let a1:{} = '123';
let a2:{} = [];
let a3:{} = {name:1};

tips 以上模式--字面量模式是不能修改值的