TS初学
基础类型
布尔值
最基本的数据类型就是简单的 true/false 值,在JavaScript 和 TypeScript 里叫做 boolean(其它语言中也一样)。
1 | let isDone: boolean = false; |
数字
和 JavaScript 一样,TypeScript 里的所有数字都是
浮点数
。 这些浮点数的类型是 number。 除了支持十进制和十六进制字面量,TypeScript 还支持 ECMAScript 2015中引入的二进制和八进制字面量。
1 | let a1: number = 10 // 十进制 |
字符串
JavaScript 程序的另一项基本操作是处理网页或服务器端的文本数据。 像其它语言里一样,我们使用
string
表示文本数据类型。 和 JavaScript 一样,可以使用双引号("
)或单引号('
)表示字符串。
1 | let name:string = 'tom' |
undefined 和 null
TypeScript 里,
undefined
和null
两者各自有自己的类型分别叫做undefined
和null
。 它们的本身的类型用处不是很大:
1 | let u: undefined = undefined |
默认情况下
null
和undefined
是所有类型的子类型。 就是说你可以把null
和undefined
赋值给number
类型的变量。
数组
TypeScript 像 JavaScript 一样可以操作数组元素。 有两种方式可以定义数组。 第一种,可以在
元素类型后面接上[]
,表示由此类型元素组成的一个数组:
1 | let list1: number[] = [1, 2, 3] |
第二种方式是使用数组泛型,Array<元素类型>:
1 | let list2: Array<number> = [1, 2, 3] |
元组 Tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 string 和 number 类型的元组。
1 | let t1: [string, number] |
当访问一个已知索引的元素,会得到正确的类型:
1 | console.log(t1[0].substring(1)) // OK |
枚举 enum
enum
类型是对 JavaScript 标准数据类型的一个补充。 使用枚举类型可以为一组数值赋予友好的名字。
1 | enum Color { |
默认情况下,从 0 开始为元素编号。 你也可以手动的指定成员的数值。 例如,我们将上面的例子改成从 1 开始编号:
1 | enum Color {Red = 1, Green, Blue} |
或者,全部都采用手动赋值:
1 | enum Color {Red = 1, Green = 2, Blue = 4} |
枚举类型提供的一个便利是你可以由枚举的值得到它的名字。 例如,我们知道数值为 2,但是不确定它映射到 Color 里的哪个名字,我们可以查找相应的名字:
1 | enum Color {Red = 1, Green, Blue} |
any
有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用 any 类型来标记这些变量:
1 | let notSure: any = 4 |
在对现有代码进行改写的时候,any 类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。并且当你只知道一部分数据的类型时,any 类型也是有用的。 比如,你有一个数组,它包含了不同的类型的数据:
1 | let list: any[] = [1, true, 'free'] |
void
某种程度上来说,void 类型像是与 any 类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void:
1 | /* 表示没有任何类型, 一般用来说明函数的返回值不能是undefined和null之外的值 */ |
声明一个 void 类型的变量没有什么大用,因为你只能为它赋予 undefined 和 null:
1 | let unusable: void = undefined |
object
object 表示非原始类型,也就是除 number,string,boolean之外的类型。
使用 object 类型,就可以更好的表示像 Object.create 这样的 API。例如:
1 | function fn2(obj:object):object { |
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种
需求1: 定义一个一个函数得到一个数字或字符串值的字符串形式值
1 | function toString2(x: number | string) : string { |
需求2: 定义一个一个函数得到一个数字或字符串值的长度
1 | function getLength(x: number | string) { |
类型断言
通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”。 类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 TypeScript 会假设你,程序员,已经进行了必须的检查。
类型断言有两种形式。 其一是“尖括号”语法, 另一个为 as 语法
1 | /* |
类型推断
类型推断: TS会在没有明确的指定类型的时候推测出一个类型
有下面2种情况: 1. 定义变量时赋值了, 推断为对应的类型. 2. 定义变量时没有赋值, 推断为any类型
1 | /* 定义变量时赋值了, 推断为对应的类型 */ |
接口
TypeScript 的核心原则之一是对值所具有的结构进行类型检查。我们使用接口(Interfaces)来定义对象的类型。
接口是对象的状态(属性)和行为(方法)的抽象(描述)
接口初探
需求: 创建人的对象, 需要对人的属性进行一定的约束
- id是number类型, 必须有, 只读的
- name是string类型, 必须有
- age是number类型, 必须有
- sex是string类型, 可以没有
下面通过一个简单示例来观察接口是如何工作的:
1 | /* |
类型检查器会查看对象内部的属性是否与IPerson接口描述一致, 如果不一致就会提示类型错误。