Number, Tuple, String, Enum, Any, Void, Null, Undefined, Never, Object, Boolean, Symbol
需要说一说的只是 Tuple, Never, Void
Tuple
Tuple 元组类型允许表示一个已知元素数量和类型的数组
当访问一个越界的元素,会使用联合类型替代
let x:[string, number] = [“1”, 1];
x[3] = “1”; //联合类型替 [String | Number]
Never & Void
Never 表示没有任何返回值
Void Null || undefined
const let var 作用域和ES6相同,别用var就行了。
readonly const 一个是修饰符,一个声明变量
readonly 主要用于接口,类,并且可以不用在声明的时候初始化,第一次赋值后不能再赋值
const 必须初始化的时候赋值。
和 C# java 差不多,用于类定义,Object定义。
需要注意 implements和extends 差别
implements 接口
extends 类,抽象类
从语义上也可以区分,可以混合继承
1 | class a { |
修饰符
没有什么特别需要注意的,如果你有后端语言经验的话,基本一致。
非的说一下就是 static 使用。
,
在内存级别,将为静态字段创建一部分内存,这些字段将在类中的所有对象之间共享。
为什么要使用?
关键在于状态,不建议在 static 当中保存状态,可能会比较麻烦,更多的用处在于在降低耦合,创建无副作用代码。
比如说数据获取,比如可以提取出的公共操作,返回公共状态,总之就是有抽象价值,对于全局有作用的函数或者属性。
基本差不多,默认值,解构,...a: string[]. 需要注意的是重载问题,支持重载不需要再使用 typeof.
1 | class GenericNumber<T> { |
function 也可以使用泛型,总之是在抽象同一类型的对象的时候,节约代码用的。
比如都是手机
1 | abstract class phoneAbs { |
T也可以 extends,不过记住这里是约束
简单变量使用ok,因为上下文问题,复杂情况可能推断不出,比如自定义类型
交叉类型(Intersection Types)
1 | interface Ant { |
联合类型(Union Types)
1 | let a: string | number; |
任意一个都ok, 但是联合类型会产生一个问题,无法推断出 a 究竟是 String or Number
1 | interface Bird { |
无法推导出究竟是 Fish 还是 Bird, 所以需要判断。
1 | let pet = getSmallPet(); |
这个时候需要判断类型.
1 | if(<Fish>pet.swim) ... //可以直接判断 |
就可以进行判断
类型别名有点类似于 interface
类型别名会给一个类型起个新名字。 类型别名有时和接口很像,但是可以作用于原始值,联合类型,元组以及其它任何你需要手写的类型。
1 | type name = string; |
也就是说 name 就是 string, 还可以使用一些莫名其妙的类型
1 | type user<T> = { |
看起来都和接口很像,使用方式也很像
1 | type name = string; |
那么 type 究竟可以做什么.
1 | type Container<T> = { value: T }; //范型 |
区别
1.type 可以声明基本类型别名,联合类型,元组等类型, 但是 interface 其实也可以,只是不能像 type 那样声明一个变量.
2. type 可以用 typeof 获取实例
3. interface可以合并声明, 两个 interface User 就自己合并了
4. 而且从语义上来说,interface 应该更加偏功能性,type 更加偏类型
和 javascript symbol 没区别
太多细节了,这个需要专门写一篇。
其实就是整合一个类型的类或者类型统一在一个命名空间下,有点类似之前 C# part,可以在多个不同的文件下。
Namespace, Class, Enum, Interface, type Alias, Function, Variable
要合并必须要知道他的怎么生成的,所以简单写一下,tsc 编译一下就ok了。
最经典的是 Namespace
1 | var user; |
那么他的合并就比较好说
1 | let LogName = "test"; |
那么他的先后顺序也会对编译产生影响.
这种合并最好还是独立起名,只是相同的声明,比如 namespace 再采取合并的方式。
https://typescript.bootcss.com/basic-types.html
https://www.jianshu.com/p/57df3cb66d3d
https://zhuanlan.zhihu.com/p/365973520
https://zhuanlan.zhihu.com/p/568705587
https://jkchao.github.io/typescript-book-chinese/typings/indexSignatures.html