类型校验
通常的,我们在写javascript代码的时候,报错最多的原因就是拼写错误,而我们也我们只有在遇到运行时错误时才会发现错误
然后在其他语言中,如java,会有类型检查器,在编译阶段,它首先检查代码中的一些简单错误,如果发现任何错误,就会出现错误
TypeScripts的编译器也有类型检查,然后只有在申明类型的时候才会检查
在javascript中一般这样写
let a;
a = 1;
a = '2';
本来我们希望变量a是个数字类型的,但是在赋值过程中不小心赋值成了字符串,但是这样的行为在javascript是不会报错的
在typescript中,我们就能用强类型约束,让变量a一直都是个数字类型
let a: number = 1;
如果我们把其赋值成字符串
a = "1";
那么,将会出现编译错误
error TS2322: Type 'string' is not assignable to type 'number'.
支持类型
基本类型
typescript可以支持boolean,number和string
let decimal: number = 6;
let done: boolean = false;
let color: string = "blue";
Array
有两个方式可以约束数组类型
第一种是用方括号,比如:
let list: number[] = [1, 2, 3];
上面显示的是这个数组应该只保存数字的类型。
第二种方法用泛型的方式声明,Array
let list: Array = [1, 2, 3];
Function
我们可以定义一个变量指向函数
let fun: Function = () => console.log("Hello");
使用typescript可以定义预期的函数返回值
function returnNumber(): number {
return 1;
}
上面的例子表示,函数的返回值必须是个number类型的值
枚举Enum
Enum是一种数据类型,由一组命名的值组成,名称通常是作为常量的标识符
enum Direction {
Up,
Down,
Left,
Right
}
let go: Direction;
go = Direction.Up;
类和接口
类和接口也是种类型,可以如下使用
class Person {};
let person: Person;
let people: Person[];
any
如果不知道使用哪种类型,或者数据值是多变的,那么就使用any类型
let notsure: any = 1;
notsure = "hello"; // any类型不会校验值
void无返回值
void意味着没有类型,通常表示函数没有返回值
function returnNothing(): void {
console.log("Moo");
}
类型断言
有的时候声明的类型是any或者联合类型==let a:number | string==的时候,类型断言就能用上了
let value: any = "Asim Hussain";
let length: number = (value).length;
(value) 是为了判定在这里的value是string类型的
泛型
利用typescript编译时校验类型的特点,我们可以写可复用代码
class Audio {}
class Video {}
class Link {}
class Text {}
class Post {
content: any;
}
上面的Post类有个content属性,是any类型,意味着他可能是Audio,或者是Video,Link,Text类型的,着同时也意味着他不会在编译的时候被校验
这样的话,我们可以分开创建AudioPost, VideoPost, LinkPost和TextPost
class AudioPost {
content: Audio;
}
class VideoPost {
content: Video;
}
class LinkPost {
content: Link;
}
class TextPost {
content: Text;
}
但是这样写感觉代码很长,很繁琐,如果要添加还得再创建个类型,使用泛型我们可以动态的生成类型
class Audio {}
class Video {}
class Link {}
class Text {}
class Post {
content: any;
}
是个泛型,T是类型变量,其实我们可以随便命名T,但是在一个的情况下,我们通常都叫T,这样我们用T就可以是任意类型了
class Post {
content: T;
}
这样我们创建特殊类型的Post,就可以直接使用了
let videoPost: Post;
可选类型
一般情况下,我们不需要添加类型
let answer;
answer = 42;
这样typescript在编译的时候不会校验类型,默认当做any类型处理
==这种事可以在tsconfig.json中配置的,设置属性为noImplicitAny,设置为诶true的话就会报错,默认情况下是false==
类型的外部链接库
如果想用某个代码,不是用typescript写的,或者说不打算用typescript编译,那么就可以使用==环境类型==
这是一个包含关于另一个库中的类型的元数据的文件,一个元类型文件
这个存储库(https://github.com/definitelytype/DefinitelyTyped)
包含了一些最流行的第三方javascript库的类型定义