十三、Types类型

类型校验

通常的,我们在写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<number> = [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 = (<string>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<T> {
    content: any;
}
复制代码

是个泛型,T是类型变量,其实我们可以随便命名T,但是在一个的情况下,我们通常都叫T,这样我们用T就可以是任意类型了

class Post<T> {
    content: T;
}
复制代码

这样我们创建特殊类型的Post,就可以直接使用了

let videoPost: Post<Video>;
复制代码
可选类型

一般情况下,我们不需要添加类型

let answer;
answer = 42;
复制代码

这样typescript在编译的时候不会校验类型,默认当做any类型处理 ==这种事可以在tsconfig.json中配置的,设置属性为noImplicitAny,设置为诶true的话就会报错,默认情况下是false==

类型的外部链接库

如果想用某个代码,不是用typescript写的,或者说不打算用typescript编译,那么就可以使用==环境类型==
这是一个包含关于另一个库中的类型的元数据的文件,一个元类型文件
这个存储库(https://github.com/definitelytype/DefinitelyTyped)
包含了一些最流行的第三方javascript库的类型定义

转载于:https://juejin.im/post/5b40dfa96fb9a04fab44f0fc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值