TypeScript 接口的灵活运用

2018-10-07  本文已影响43人  Zszen

在这之前,js开发的属性和对象可以随便增添和删减,灵活度虽然高,也增大了我们开发的难度,我们必须时刻清醒的认识每个变量对应的意义和属性。

但到了TypeScript这里,让我们很方便的把这一系列问题解决了。让我看一下例子:

我想要定义一个复杂的数组,要求内部包含数组,对象等其他的内容

我使用js来写:

var obj = [];
obj.push({name:"123",info:{x:1,y:2}});

在js里面,你很难分清对象定义的是什么,虽然可以通过命名来弥补,但是如果工程量上来了,那么你应该如何来处理海量code中的某个字母错误?

ts来写:

let obj:{name:string,info:{x:number,y:number}}[] = [];
obj.push({name:"123",info:{x:1,y:2}});

let unit = <{name:string,info:{x:number,y:number}}>target;

这样写法,在输入和获取都很灵活的能拿到对象以及内部对象的变量属性。但是这个对象描述过于冗长,我们每个需要的地方都要复制黏贴,实在麻烦。

ts 接口来写:

interface TargetInfo{
  name:string;
  info:{x:number,y:number};
}
let obj:TargetInfo[] = [];
obj.push({name:"123",info:{x:1,y:2}});

let unit = < TargetInfo >target;

这样可以定义严格的对象写法,而且引用也方便。但因为严格,这个接口是不允许多写和少写变量的。

ts 接口的可选和可扩展

interface TargetInfo{
  name?:string;
  info:{x:number,y:number};
  [propName: string]: any;
}

let obj:TargetInfo[] = [];
obj.push({other:true,info:{x:1,y:2}});

这时候可以扩展其他值

ts 接口注意一点

interface TargetInfo{
  name?:string;
  info:{x:number,y:number};
  [propName: string]: number;
}

注意这样写会报错,可扩展参数一样约束了可选参数的类型,name为string,而可扩展参数为number,这是不允许的。

参考:
https://stackoverflow.com/questions/14425568/interface-type-check-with-typescript
https://www.jianshu.com/p/1c2fb566cdd2

上一篇 下一篇

猜你喜欢

热点阅读