入个TypeScript的门(3)——接口与类型别名

88 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

我们在使用TS时,面对函数和对象有时候挺不好定义的,比如我们想定义几个函数:

const add:(x:number,y:number)=>number = function(x,y) {
    return x+y
}
const reduce:(x:number,y:number)=>number = function(x,y) {
    return x-y;
}
const ride:(x:number,y:number)=>number = function(x,y) {
    return x*y;
}

我们发现他们的参数类型和返回值类型都是相同的,但是我们得重复定义多次。

或者当参数是一个对象时:

function dealData(person:{name:string,age:number}):{name:string,age:number} {
    person.age+=1;
    return person;
}

我们重复写这么多声明比较麻烦,于是TS就有了类型别名和接口来简化。

类型别名

TS中的类型别名就是使用type关键字。

type s = string;
let a:s = 'sdsd';

我们可以用type来给string取一个新的名字s,我们以后再定义变量时就可以使用s来代替string了。

当然type不仅仅可以来声明普通类型,还可以声明常量类型。

type name =  'xiaolei' | 'xiaoxu'
let person:name = 'xiaolei';
person = 'xiaoxu';
person = 'xiao';  //报错:不能将类型“"xiao"”分配给类型“name”

我们将person定义为name类型后,那么person的值就只能是xiaolei和xiaoxu两个值的其中一个了。

同时type还可以定义函数:比如我们简化上面的加减乘函数

type Fn = (x:number,y:number)=>number;
const add:Fn = function(x,y) {
    return x+y
}
const reduce:Fn = function(x,y) {
    return x-y;
}
const ride:Fn = function(x,y) {
    return x*y;
}

此外用来定义对象也是可以的:

type Person = {name:string,age:number};
const p1:Person = {name:'xiaolei',age:18}

还可以定义数组:

type Person = {name:string,age:number}
type data = Person[]
let ps:data = [{name:'xiaolei',age:18},{name:'xiaoxu',age:18}]

定义元组:

type data = [number,string]

映射类型

此外,type可以进行映射:

type Keys = "name" | "sex"
type Person = {
  [Key in Keys]: string //类似 for ... in
}
let p: Person = {
  name: 'xiaoxu'sex: 'man'
}

当然,type声明的代码,在TS编译后就会被删除了。比如我们上面声明的Person被编译后:

type Person = {name:string,age:number};
const p1:Person = {name:'xiaolei',age:18}
---------------------------编译后-------------
var p1 = { name: 'xiaolei', age: 18 };

接口

当然除了使用类型别名外,还有一种方式也可以用来声明类型,那就是接口。

interface InterPerson {
    name:string,
    age:number
}
const p1:InterPerson = {name:'xiaolei',age:18};

接口也会和type一样,在ts编译后就被删除了。

接口一般只能用来定义对象或者class类的类型,而type可以用来定义基本类型、函数、数组、元组、常数、对象,范围要广得多。但是在对象和class中基本都还是使用接口为主。因为接口又继承、实现再配合ts的class可以实现面向对象开发。关于更多的interface的细节可以在class中写写。