年前由于需要了解 Egret 学习了一下 TypeScript,现在做一下学习笔记。以免不知道学了些什么。
主要学习资料就是官方文档
5 分钟入门
TS 是 JS 的超集,所以完全可以按所了解的 JS 语法来写 TS 程序。所以遇到不太熟悉的地方就按 JS 的写法来写即可。
TS 代码最终会被翻译成 JS 代码。因此最终的 JS 代码会丢失不少 TS 代码中的类型信息。
TS 中可以在变量后面加类型声明,基本语法如下:
varName :<typename>
类型名称一般是小写如string
,number
主要是为了避免与 JS 中的原生类型冲突。TS 中的实现接口的判定是按结构而不是按名称的。也就是如果其实现符合某一个接口,也就意味着实现了某接口。即如下代码中,
banxi
这一对象即可认为是实现了Person
接口。
interface Person{
name:string;
age:number;
}
let banxi = {name:"banxi", age:18};
- TS 支持更直接的类声明。
class Student{
fullName:string
constructor(public firstName:string,public lastName:string,middleInitial:string){
this.fullName = firstName + " " + middleInitial + " " + lastName;
}
}
上面的声明将翻译成如下 JS 代码:
var Student = /** @class */ (function () {
function Student(firstName, lastName, middleInitial) {
this.firstName = firstName;
this.lastName = lastName;
this.fullName = firstName + " " + middleInitial + " " + lastName;
}
return Student;
}())
从上面的翻译结果也可以看出,对于构造函数中带有访问修饰符public
的参数会被当作类的属性处理。
快速入门手册
基本类型
-
boolean
类型let isDone :boolean = true;
-
number
类型let binary:number = 0b1010;let hex:number = 0xff1e;
- String 类型,类似 JS,也支持
Hello,${expr}
这样的插值表达式,并且支持多行字符串。 - Array 类型,
let list :number[] = [1,2,3];
或let list:Array<number> = [1,2,3];
- Tuple 类型,
let entry: [string,number] = ["banxi", 18];
,可以通过entry[0]
,entry[1]
来访问。如果索引大于1
那么对应的数据类型其实是string|number
即一个联合类型。 - Enum 类型,
enum Color{Red,Green,Blue};
对应翻译的 JS 代码如下:
var Color;
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}))
Any 类型,
let anyObj:any;
使用any
类型来放松类型检查。如果使用Object
则存在只能调用Object
类的方法的限制。void
类型, 一般用在函数返回类型中表示此函数没有返回值。undefined
类型与null
类型。在没有启用严格检查时它们可以当作是其他类型的子类型,但是启用了--strictNullChecks
选项之后。则只能赋值给void
及它们自己的类型。或者对应参数是类似string | null | undefined
这样的联合的类型。never
类型,一般用在函数返回值类型中表示此函数永远不会执行到return
语句。
关于类型转换的说明。
- 有 angle-bracket 语法的转换方式如:
let someValue:Any = "a string"; let len:number = (<string>someValue).length;
- 或者通过
as
操作符,let len:number = (someValue as string).length;
值得注意的是,当启用了 JSX
支持时,上面的第一种方式不可用。