TypeScript 接口

简介:

TS的接口好像C#/Java中的接口 , 但是TS的interface是不能继承(implement)其他的interface , 但是TS的interface可以规范自己的结构Object.无论如何TS比起JS来说,在OOP上面进步了不少.

注 : 下面的代码都是TS代码 


1
2
3
4
5
6
7
8
9
10
11
12
13
/**
  * Created by CV-PC153 on 2017/8/7.
  */
interface User{
     id:number;
     name:string;
}
function  greeter(user:User):string{
     return  `No.${user.id}, name is :${user.name}`;
}
let myObj : User = { id : 1 ,name :  "Aonaufly"  };
 
document.body.innerHTML = greeter(myObj);

运行结果:

wKioL1mJWETBUuooAAAfFfC6OK0641.png-wh_50

这里有一个奇怪的现象:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
  * Created by CV-PC153 on 2017/8/7.
  */
interface User{
     id:number;
     name:string;
}
function  greeter(user:User):string{
     return  `No.${user.id}, name is :${user.name}`;
}
let myObj = { age : 1 ,id : 1 ,name :  "Aonaufly" };
 
document.body.innerHTML = greeter(myObj);

以上代码 , 去掉了myObj的类型 , 并且加上了一个age : 1 依然可以得到一个正确的结果.

继续更改在greeter方法中打印出user.age , 会报错: 

wKioL1mJXNrxYrvgAABkOGi8uwk466.png-wh_50

结果编译报错:

wKiom1mJXT7QZ-VIAABCA1T8Trw865.png-wh_50

很有意思 , 可以给个总结 :

object 没有强制指定是interface(上文中的User)类型的话 , 只要它包含了User所有属性,它任然可以当做User使用.方法中的参数,如果被限定为interface(上文中的User),那此方法只能使用interface限定的方法.反之若参数不限制:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
  * Created by CV-PC153 on 2017/8/7.
  */
interface User{
     id:number;
     name:string;
}
function  greeter(user:any):string{
     return  `No.${user.id}, name is :${user.name} , age : ${ user.age }`;
}
let myObj = { age : 1 ,id : 1 ,name :  "Aonaufly" };
 
document.body.innerHTML = greeter(myObj);

结果如下:

wKiom1mJXxaTXAUoAAAtDXDBrxA273.png-wh_50

但这样显然又不符合OOP的思想了.


可选属性: (?符号 如 age?:number 那么age就是一个可选属性),顾名思义,继承者可选属性赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
  * Created by CV-PC153 on 2017/8/7.
  */
interface User{
     id:number;
     name:string;
     age?:number;
}
function  greeter(user:User):string{
     return  `No.${user.id}, name is :${user.name} , age : ${ user.age }`;
}
let myObj:User = { id : 1 ,name :  "Aonaufly" };
 
document.body.innerHTML = greeter(myObj);

结果:

wKioL1mJYz6xwIw8AAAtreVITRA831.png-wh_50

所以 , 可选属性有时候比较坑.你可能想显示age信息,结果忘了在myObj中定义,也不会报错.如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
  * Created by CV-PC153 on 2017/8/7.
  */
interface User{
     id:number;
     name:string;
     age?:number;
}
function  greeter(user:User):string{
     return  `No.${user.id}, name is :${user.name} , age : ${ user.age }`;
}
let myObj:User = { id : 1 ,name :  "Aonaufly"  , age:1};
 
document.body.innerHTML = greeter(myObj);

如果定义了可选属性,一定要注意.




在interface中申明函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
  * Created by CV-PC153 on 2017/8/7.
  */
interface TalkPro{
     name : string;
     content : string;
}
interface SayFunc{
     (talk : TalkPro):string;
}
let iSay : SayFunc;
iSay =  function (talk :TalkPro):string{
     return  `${talk.name}:${talk.content}`;
}
function  greeter( func :  SayFunc , talk : TalkPro ):string{
     return  func(talk);
}
let i_went_talk : TalkPro = { name: "Aonaufly"  , content: "interface SayFunc is like C# at statement function"  };
 
document.body.innerHTML = greeter(iSay,i_went_talk);

SayFunc申明了一个方法 , 得到结果:

wKioL1mJd-bRqsO0AAAjKVxaJZc666.png-wh_50


可索引的类型

数字索引的返回值必须是字符串索引返回值类型的子类型


类继承接口(动态性多态)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
  * Created by CV-PC153 on 2017/8/7.
  */
interface TalkPro{
     name : string;
     content : string;
}
interface SayClass{
     toTalk( ):string;
}
interface SayCtor{
     new ( msg : TalkPro ) : SayClass;
}
 
class Chinese implements SayClass{
     private msg : TalkPro;
     constructor( msg : TalkPro ){
         this .msg = msg;
     }
     toTalk( ):string{
         return  `[Chinese] ${ this .msg.name}:${ this .msg.content}`;
     }
}
class USA implements SayClass{
     private msg : TalkPro;
     constructor( msg : TalkPro ){
         this .msg = msg;
     }
     toTalk( ):string{
         return  `[USA] ${ this .msg.name}:${ this .msg.content}`;
     }
}
 
function  create_sayClass( ctor : SayCtor , msg : TalkPro ) : SayClass {
     return  new  ctor( msg );
}
 
let chinese_ : TalkPro = { name: "Aonaufly"  , content: "ni hao!"  };
let usa_ : TalkPro = { name: "Polo"  , content: "hello!"  };
 
let cla_chinese : SayClass = create_sayClass( Chinese , chinese_);
let cla_usa : SayClass = create_sayClass( USA , usa_);
 
function  greeter( saycl : SayClass ):string{
     return  saycl.toTalk();
}
 
document.body.innerHTML = greeter(cla_usa);

结果:

wKiom1mJmvOCL3GQAAAjxsW5cd4890.png-wh_50











本文转自Aonaufly51CTO博客,原文链接: http://blog.51cto.com/aonaufly/1954600,如需转载请自行联系原作者



相关文章
|
5月前
|
JavaScript
​​​​Typescript 接口 和继承 数组处理
ts的基础数据类型,可用来处理一般数据,但是碰到后台传入的复杂对象数组的时候,我们可以使用ts中的接口来定义处理
58 0
|
5月前
|
JavaScript 前端开发 C++
Typescript.中文.接口声明.lib.es5.d.ts
Typescript.中文.接口声明.lib.es5.d.ts
37 0
|
10天前
|
JavaScript
typeScript基础(5)_对象的类型-interfaces接口
本文介绍了TypeScript中接口(interfaces)的基本概念和用法,包括如何定义接口、接口的简单使用、自定义属性、以及如何使用`readonly`关键字定义只读属性。接口在TypeScript中是定义对象形状的重要方式,可以规定对象的必有属性、可选属性、自定义属性和只读属性。
26 1
|
12天前
|
数据采集 JavaScript 前端开发
使用 TypeScript 接口优化数据结构
使用 TypeScript 接口优化数据结构
|
2月前
|
开发框架 前端开发 JavaScript
在基于vue-next-admin的Vue3+TypeScript前端项目中,为了使用方便全局挂载对象接口
在基于vue-next-admin的Vue3+TypeScript前端项目中,为了使用方便全局挂载对象接口
|
3月前
|
JavaScript 开发者 索引
TypeScript接口与类型别名:深入解析与应用实践
【7月更文挑战第10天】TypeScript的接口和类型别名是定义类型的关键工具。接口描述对象结构,用于类、对象和函数参数的形状约束,支持可选、只读属性及继承。类型别名则为复杂类型提供新名称,便于重用和简化。接口适合面向对象场景,类型别名在类型重用和复杂类型简化时更有优势。选择时要考虑场景和灵活性。
|
2月前
|
JavaScript 前端开发 API
Vue 3+TypeScript项目实战:解锁vue-next-admin中的全局挂载对象接口,让跨组件共享变得高效而优雅!
【8月更文挑战第3天】在构建Vue 3与TypeScript及vue-next-admin框架的应用时,为提高多组件间共享数据或方法的效率和可维护性,全局挂载对象接口成为关键。本文通过问答形式介绍其必要性和实现方法:首先定义全局接口及其实现,如日期格式化工具;接着在`main.ts`中通过`app.config.globalProperties`将其挂载;最后在组件内通过Composition API的`getCurrentInstance`访问。这种方式简化了跨组件通信,增强了代码复用性和维护性。
32 0
|
3月前
|
JavaScript 前端开发 程序员
Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
65 0
|
3月前
|
JavaScript Java 索引
TypeScript(四)接口
TypeScript(四)接口
32 0
|
3月前
|
JavaScript API
TypeScript 项目中接口的统一管理
TypeScript 项目中接口的统一管理
42 0