TypeScript学习笔记之接口类型
TypeScript的接口,个人理解就是一种约束,包括各种类型的契约或者代码定义上的契约。当然,和java中的用法基本一致,接口可以被继承也可以被实现。
定义一个简单的interface
interface LabelledValue {
label: string;
}
function printLabel(labelledValue: LabelledValue) {
console.log(labelledValue.label);
}
let myLabel: LabelledValue = {label: 'this is my label'}
printLabel(myLabel) // this is my label
注意:
1、可选属性:label?: string;
2、只读属性:readonly label: string;(只允许创建的时候修改一次)
readonly和const:变量声明用const,属性声明用readonly
看一个readonly的例子:
interface Point {
readonly x: number;
readonly y: number;
}
let p1: Point = {x: 121, y: 78}
console.log(p1); // {x: 121, y: 78}
p1.x = 22 // wrong!
注意:
如果是只读型数组,请使用ReadonlyArray
额外属性检查
任意数量属性
interface SquareConfig {
color?: string;
width?: number;
[propName: string]: any; // 代表任意属性,其中key类型为string,value类型为any任意
}
函数类型接口
接口可以描述js对象中拥有的各种外形。比如如下可以描述js对象具有函数类型:
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(src, sub) { // ts会自动识别参数类型,参数名可以不一致
let result = src.search(sub);
return result > -1;
}
其中,source、subString均为string型入参,boolean类型为出参。
可索引的类型
接口描述这种类型,比较有意思,可索引的类型包含两种,一种是对象,一种的数组。可以在接口中描述索引的类型,以及索引值的类型,如下:
interface StringArray {
[index: number]: string;
}
let z1: StringArray = {1: "awdawd"}
let z2: StringArray = ['admin']
console.log(z1, z2); // { '1': 'awdawd' } [ 'admin' ]
如上接口,可以被数组实现,也可以被对象实现。索引签名除了number还要string,可以同时使用两种类型的索引。但是要注意:数字类型索引的索引值一定要是字符串索引类型索引值的子类型。举个例子:
class Animal {
name: string;
}
class Dog extends Animal {
breed: string;
}
// 错误:使用'string'索引,有时会得到Animal!
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
说明,按照意思是number索引类型是Animal,string索引类型是Dog,Animal必须是Dog的子类型,但是实际恰恰相反——Dog是Animal类型的子类型,所以这里会报错。因为当使用number作索引时,js会将它转换为string,然后再去索引。所以必须保证number索引是string索引的子类型,否则会造成索引值混乱。
使用索引签名实现ReadonlyArray效果:
interface ReadonlyStringArray {
readonly [index: number]: string;
}
let myArray: ReadonlyStringArray = ["Alice", "Bob"];
myArray[2] = "Mallory"; // error!
实现一个接口
在java里面,接口生来就是被实现的,就好像抽象对象生来就是要被继承一样。
interface ClockInterface { // 定义接口,包含属性currentTime,所有该接口的实现必须包含该字段
currentTime: Date;
}
class Clock implements ClockInterface{
currentTime: Date; // 该字段必须包含
constructor(h: number, m: number){};
}
同样地,在接口里面可以再加函数约束,所有实现必须重写该函数:
interface ClockInterface { // 定义接口,包含属性currentTime,所有该接口的实现必须包含该字段
currentTime: Date;
setTime(d: Date);
}
class Clock implements ClockInterface{
currentTime: Date; // 该字段必须包含
setTime(d: Date) {
this.currentTime = d;
}
constructor(h: number, m: number){};
}
继承一个接口
接口和类相似,彼此之间是可以相互继承的,使用关键字extend实现:
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
let square = <Square>{}; // 断言,同:{} as Square
square.color = "blue";
square.sideLength = 10; // { color: 'blue', sideLength: 10 }
这里,Shape接口被Square接口所继承,所以自然Square接口多了一个属性color。
混合类型
有时期望使用接口同时描述对象的属性、方法等,可以如下:
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
TypeScript学习笔记之接口类型的更多相关文章
- TypeScript学习笔记之基础类型
从今天开始学习typescript了,记录ts学习点滴,最后,使用ts结合nodejs开发后端应用,一起共勉吧: typescript最新版本2.6,所有演示代码均基于此版本 开始之前确定安装了如下n ...
- Go语言学习笔记(9)——接口类型
接口 Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口. /* 定义接口 */ type interface_name in ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- Hadoop学习笔记—5.自定义类型处理手机上网日志
转载自http://www.cnblogs.com/edisonchou/p/4288737.html Hadoop学习笔记—5.自定义类型处理手机上网日志 一.测试数据:手机上网日志 1.1 关于这 ...
随机推荐
- Vue浅谈
谈Vue 最近在学习Vue相关的知识点并且也做一些练手,就在学习过程中出现的各种坑爹的地方做一个总结!之后再遇到也不会抓瞎. 1.Vue工程的安装 (1)首先先安装node.js这是Vue的运行基础. ...
- HTML基础--元素类型及类型转换
元素类型及类型转换 一.XHTML元素分类 根据css显示分类,XHTML元素被分为三种类型:块状元素,内联元素,可变元素 1.块状元素(block element) 1)块状元素在网页中就是以块的形 ...
- MySQL5.6的optimizer_trace
MySQL的explain是各种执行计划选择的结果,如果想看整个执行计划以及对于多种索引方案之间是如何选择的? MySQL5.6中支持这个功能,optimizer_trace 这个是mysql的参数, ...
- 在64位Win7环境+64位JDK下,运行64位Eclipse,提示“Failed to load the JNI shared library”错误,提示jvm.dll不对
-startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --launcher.library plugins/org.ecl ...
- IIFE(立即执行函数表达式)
我们经常会看到这样的写法: ;(fuction () { // do something })() 这就是一个简单的IIFE(立即执行函数表达式,immediately-invoked functio ...
- android 加载图片圆角等功能的处理
以Glide为例: Glide.with(getContext()).load(item.getSoftLogo()).transform(this.glideRoundTransform).into ...
- python学习笔记 python实现k-means聚类
# -*- coding: utf-8 -*- """ Created on Thu Mar 16 14:52:58 2017 @author: Jarvis " ...
- 并行设计模式(一)-- Future模式
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java第一季
1.Java常量的应用 语法:final 常量名 = 值: final String LOVE = "IMOOC"; final double PI = 3.14 举一个简单的例子 ...
- Dashboard集群
#Dashboard集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Dashboard集群 #####在 ...