TS学习2-TS中的类型
Contents
1 JS与TS的数据类型
-
JS(8种)
number
boolean
string
bigint
symbol
null
undefined
object
(含Array Function Date..)
-
TS
JS 8种
void
never
enum
unknown
any
- 自定义类型
interface
type
(type严格来讲算类型别名)
2 理解TS的数据类型
- 从集合的角度理解TS数据类型
- 即每一个type都表示类型的集合
&
表示交集;|
表示并集
|
|
2 描述number、boolean和string的数据类型
- 先说结论:使用小写的
2
vsnew Number(2)
|
|
- 为什么一个值身上会存在toFixed方法?
|
|
- 说明JS包装了这个a,使其具有了Number实例对象的属性与方法
- 正是由于包装对象机制的存在,给人一种“JS一切皆对象”的假象
- JS中的Number、String和Boolean只用于包装对象,不适合作为数据类型
3 描述普通对象的数据类型
使用Object
或object
去描述对象的数据类型,太过于宽泛,类似any
所以一般使用索引签名或Record泛型来描述普通对象
|
|
4 描述数组对象的数据类型
使用Array
去描述数组的数据类型,太过于宽泛,一般使用
Array<?>
string[]
[string, number]
|
|
5 描述函数对象的数据类型
使用Function
去描述数组的数据类型依然不够精确,一般使用箭头函数(?) => ?
|
|
|
|
6 其他对象
直接用class描述,例如
|
|
7 any、unknown和never
-
any是全部类型的全集
-
unknown表示暂时不能确定类型,注意在使用时断言即可
|
|
- never是空集合,表示不应该出现的类型,出现说明出错了
|
|
8 enum类型
-
使用enum的两种情况
- status状态字段
1 2 3 4 5 6 7 8 9 10
// 定义 enum S { todo = 0, done, deleted } let status = 0 // 使用 status = S.todo status = S.done
- 前端权限控制(二进制与计算)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
enum Permission { None = 0, //0000 Read = 1 << 0, //0001 Write = 1 << 1, //0010 Delete = 1 << 2,//0100 Manage = Read | Write | Delete // 0111 } const user = { permission: 0b0101 } // 与计算 只有1&1才为1 // a&b===b 说明a有b的所有1 if((user.permission & Permission.Write) === Permission.Write) { console.log('有写权限') }
-
不使用enum的情况
- 当枚举为string时,应使用type
1
type S = 'done' | 'working' | 'stop'
- 以上两种情况之外的,都不建议使用enum
9 type和interface
9.1 type
- 类型别名(Type Aliases)
- 给其他类型取个外号,并不会产生新的类型
|
|
9.2 interface
- 声明接口
- 描述对象的属性
|
|
- interface就是把type能做的事用面向对象的思想翻译了一下(非绝对)
9.3 区别
-
interface只描述对象的属性;type则描述所有数据类型
-
type只是别名;interface则是类型声明
-
type不可重新赋值,不方便扩展;interface具有自动合并的特性,方便扩展
- 对外API尽量用interface,对内尽量用type
|
|
Author gsemir
LastMod 2022-10-11