类型排序:
1.top type 顶级类型 any unknown
2.Object
3.Number String Boolean
4.number string boolean
5.1 false ‘sting’
6.never
Any类型
不需要类型检查,直接让他们通过编译阶段检查
let noSure:any=4
notSure="maybo a string insted"
noSure=false
声明变量的时候没有指定任意类型默认为any
let anys;
anys='123'
anys=true
只知道一部分数据的类型时,any类型也是有用的
let list:any[]=[1,true,"free"]
list[1]=100
any与object类型的区别
any允许你在编译时可选择地包含或移除类型检查
object类型的变量只是允许你给它赋任意值,但是却不能在它上面调用任意的方法
let anys:any=4
anys.ifItTxisits() //okay, ifItExists might exist at runtime
anys.toFixed() //okay, toFixed exists
let anys:object=4
anys.toFixed();//报错 Property 'toFixed' doesn't exist on type 'Object'
弊端如果使用any就失去了TS类型检测的作用
unknown类型
typescript3.0中引入一个顶级unknown类型,但它更安全。与any一样,所有类型都可以分配给unknown,但是当没有类型断言或基于控制流的类型细化时unknown不可以赋值给其他类型,除了它自己和any外。同样地,在unknown没有断言或细化到一个确切类型之前,是不允许在其上进行任何操作的。
//unknown另外i行可以接受任何类型的赋值
let value:unknown;
value=1; //ok
value='string';//ok
value=true;//ok
value=[];//ok
value=null;//ok
value=undefined;//ok
value=Symbol("type");//ok
value={name:"object"}//ok
//unknown类型只能赋值给unknown或any类型的变量
let value:unknown
let num:number
let str:string
let anys:any
let unk:unknown
num = value; // Error: Type 'unknown' is not assignable to type 'number'.
str = value; // Error: Type 'unknown' is not assignable to type 'string'.
obj = value; // Error: Type 'unknown' is not assignable to type 'object'.
any = value; // OK
unk = value; // OK
//unknown类型不能访问其属性,也不能访问其方法
value.toFixed(); // Error: Object is of type 'unknown'.
value.name; // Error: Object is of type 'unknown'.
//除非使用类型断言或类型守卫
(value as number).toFixed();//ok
if(typeof value==='string'){value.toUpperCase()} //ok
if(value instanceof String){console.log(value.toString())}
//unknown类型可以用来表示不确定的输入参数,或者不确定的返回值
function log(value:unknow){console.log(value)}
function getSomething():unknown{return Math.random()>0.5?1:"one"}
//unknow类型可以用于泛型中
function identity<T>(value:T):T{
return value
}
let unknowIndetity:unknown=identity('hello')
//未知类型的类属性不需要明确赋值
class c1{
a:string;//Error
b:unknown;
c:any;
}
any类型和unknown顶级类型区别
- unknown类型比any更加严格
- 如果是any类型在对象没有这个属性的时候还在获取是不会报错的;如果是unknown是不能调用属性和方法
如果是any类型在对象没有这个属性的时候还在获取是不会报错的
let obj:any={b:1}
obj.a
如果是unknow 是不能调用属性和方法
let obj:unknown={b:1,ccc:():number=>213}
obj.b
obj.ccc()