先学会区分类型和类的区别。
JS的基本类型:null undefined symbol number boolean string bigint object
类:对object的分类,如Array,Object等
注:typeof 函数 返回一个function,typeof null 返回一个object
const a:string = 'hi'
const b:number = 1
const c:undefined = undefined
const d:boolean = ture
const e:bigint = 123n
const f:symbol = Symbol('hi')
const obj:Object = {}
const arr:Array<number | string |null> = ['1',2,null]
.........................................................................................
const add = (x:number,y:number):number =>x+y //第一种 类型写在函数体中
-----------------------------------------------
const add:(x:number,y:number) => number =(x,y) => x+y //第二种 写在:后面
-----------------------------------------------
type Add =(x:number,y:number) => number
const add:Add = (x,y) => x+y//第三种 常用写法type缩写
-----------------------------------------------
interface AddWithProps{
(x:number,y:number):number
xxx:string
} // 第四种 有属性,只能用interface
const add2:AddWithProps = (x,y) => x+y
add2.xxx = 'yyy'
..........................................................................................
TS比JS多的类型:any,unknown,void,never,元祖,enum(枚举)
let a:any = 1
a = "1"//不报错,因为a为任意类型
.........................................................................................
type C = {name:string}
let b:unknown = JSON.parse('{"name":"frank"}')
console.log((b as C).name) //断言,不知道b的类型,我猜它为C
.........................................................................................
let print:() => void =() =>{console.log(1)} //不能加参数,尽量别用return
.........................................................................................
let a:never //a不能用,什么类型都不是
//举例说明
type Dir = 1 | 2 | 3 | 4 | undefined
let dir:Dir
Switch(dir){
case 1 :
break;
case 2 :
break;
case 3 :
break;
case 4 :
break;
case undefined :
break;
default:
console.log(dir)
break;
}
//此时dir的类型为never,什么类型都不是,因为所有的类型都break了
//还可举例说明
type Dir = string & number //string 和 number 合集什么都不是,为never
........................................................................................
//元祖:不可变更长度的数组
let a:[number,number] = [1,2]
let a = [1,2,3] //会报错
........................................................................................
enum Dir2 = {1,2,3,4}
let d:Dir2 = Dir2.1
let d2:Dir2 = Dir2.2
//个人不喜欢用枚举,可以用另外一种方式
type Dir3 = '1' | '2' | '3' | '4' |
let d:Dir3 = '1'
let d2:Dir3 = '2'
TS泛型:
type Add<T> = (a:T,b:T) => T //T是广泛的类型,下边具体用到可以具体分类
const addA:Add<number> = (a,b) => a+b
const addB:Add<string> = (a,b) => a+' '+b
重载:
function add:(a:string,b:string):string;
function add:(a:number,b:number):number;
function add:(a:any,b:any):any{
if(typeof a === 'number' && typeof b === 'number'){
return a+b
}else{
return a+' '+b
}
}
add(1,2) //可以执行
add('hello','world')//可以执行
add('hi',1)//报错