如下都是object对象数据类型。
let a = {'name':'test'}
let fun = function(){}
复制代码
但是,如果我们如下使用object
来做类型约束。就显得没什么用,因为太宽泛了,万物皆对象。
let a:object
复制代码
如下这个对象中有name属性,并且类型需要时字符串类型。
let b :{name:string}
复制代码
只有给name属性赋值、并且是字符串的值。才不会报错。
b = {
name:'sun'
}
复制代码
如果为空对象,则会报错。(并且属性添加多了肯定也会报错)
问题来了
如果还有一个age属性,有的情况有、有的情况没有怎么办?如下在冒号前加一个问号,表示这个属性是可选的。
let b :{name:string,age?:number}
复制代码
那么问题又来了
如果我有多个不确定的值。我们可以这么写 [propName:string]:any
中括号里的 propName
是属性名、随便写的,写什么都可以。:string
属性名的类型是 string
,any
表示任意类型的属性
// 字符串属性名,任意类型属性
let cs : {name:string,[propName:string]:any}
cs = {name:'sss', age:1, sex:'female'}
复制代码
如下这种类型约束,与 :object
一样,太宽烦了。
let fun :Function
复制代码
我们使用下面,类似箭头函数的写法
let fun1 : (aa:number,bb:number)=>number
复制代码
在给fun1赋值的时候,参数类型、返回值类型还是需要再约束的。
语法: (形参:类型,形参:类型...)=> 返回值
fun1 = function(n1:number,n2:number):number{return n1+n2}
复制代码
为了性能来说,我们数组中大部分存储的是同类型的值。
如下,字符串类型的数组
let str_arr:string[]
str_arr = ['1','2','3']
复制代码
如下,数值类型的数组
let num_str:number[]
num_str = [1,2,3]
复制代码
语法
Arrray<数据类型>
有点像Java
let arr:Array<number>
复制代码
相较于JS而言,TS新增几种类型。
元组,其实就是固定长度的数组。当你的数据中元素时固定的时候,最好使用元组。
python语言中也有元组,写法是tuple = (1, 2, 3, 4, 5, 6, 7 )
,当然这是句废话。
如下,表示需要两个元素,类型都是string
let tuple:[string,string]
tuple = ['a','b']
复制代码
而这个,表示需要两个元素,类型分别是string和number
let tuple1:[string,number]
tuple1 = ['c',1]
复制代码
这个对象中包含name和sex两个属性。但是啊,我们作为性别,我们项目中不会存字符串的 '男'或者'女'(这里也有对数据库存储的内存的一些考虑)。我们大部分是存 0 或 1,但是前端展示的时候又要使用字符串的 '男'或者'女'。
let i :{name:string,sex:string}
i = {
name:'李四',
sex:'女'
}
复制代码
enum Sex{
male=0,
female=1
}
let i :{name:string,sex:Sex}
i = {
name:'李四',
sex:0
}
复制代码
在前端先展示的时候你可以通过 if else
判断是male或female 然后赋值展示男或女。但是我这里还是想用枚举的话就像如下的写法
我们定义一个对象。把枚举的Sex.male作为键
Sex.male
对应的也就是0const SexText = {
[Sex.male] : '男',
[Sex.female] : '女'
}
let show = SexText[0]
复制代码
类型的别名,就相当于SQL语句给查到的字段as起别名一个道理。
type myType = string;
let m:myType
复制代码
当然,给string
类型起别名,毫无意义。
下面两个变量的类型都是 1|2|3|4|5
也就是值必须是这五个数字中的一个。这种或的写法,也可以在结合枚举使用。这时我们可以给1|2|3|4|5
起别名。
let k:1|2|3|4|5
let j:1|2|3|4|5
复制代码
let range = 1|2|3|4|5
let k:range
k = 5
k = 6 //此时就会报错了