typescript handbook 学习笔记4
概述
这是我学习typescript的笔记。写这个笔记的原因主要有2个,一个是熟悉相关的写法;另一个是理清其中一些晦涩的东西。供以后开发时参考,相信对其他人也有用。
学习typescript建议直接看中文文档或英文文档。我是看的英文文档。
类
基本使用
class Greeter {
//只读,必须在声明的时候或者constructor里面初始化
readonly greeting: string;
//constructor里面的只读
constructor(readonly message: string) {
this.greeting = message;
}
greet() {
return 'Hello, ' + this.greeting;
}
}
class Greeter01 extends Greeter {
constructor(message: string = 'everyone') {super(message);}
greet() {
return 'hi, ' + this.greeting;
}
}
let sam = new Greeter01('world');
sam.greet();
public, private和protected
- public是默认的,如果不声明就是public。
- private指只能内部访问,不能被子类访问。
- protected指只能被内部或者子类的实例访问。
注意:
- 2个类相同,除了成员相同之外,private和protected的元素必须来自于同一处代码。
- 如果一个类的constructor被标记为protected,那么表示这个类不能被实例化,只能通过它生成子类,然后实例化子类。
存取器
存取器能够拦截并重写读写属性的操作,如果只有get没有set就会被认为是只读的。
let language = {
log: ['example', 'test'],
set current(name) {
this.log.push(name);
},
get current() {
if (this.log.length === 0) {
return undefined;
} else {
return this.log[this.log.length - 1];
}
}
}
language.current = 'EN';
console.log(language.current);
静态属性和方法
在属性或方法前面加上static就是静态属性或方法了,实例属性或方法用this访问,静态属性或方法用类名来访问。
抽象类
抽象类和接口类似,只能被继承,不能被实例化,和接口不同的是,抽象类可以定义一些方法,这些方法可以被继承。
抽象类也有抽象属性,抽象属性和接口一样,一定要在子类中实现。
类当做接口使用
很好理解,看下面这段代码即可。
class Point {
x: number;
y: number;
}
interface Point3d extends Point {
z: number;
}
let point3d: Point3d = {x: 1, y: 2, z: 3};
函数
简写形式和完整形式
由于编译的时候可以从简写形式推断出完整形式,所以推荐用简写形式。
//简写形式
function add(x: number, y: number): number {
return x + y;
}
let myAdd = function(x: number, y: number): number { return x + y; };
//完整形式
let myAdd: (x: number, y: number) => number =
function(x: number, y: number): number { return x + y; };
可选参数和默认参数
//可选参数
function buildName(firstName: string, lastName?: string) {
return firstName + " " + lastName;
}
//默认参数
function buildName(firstName: string, lastName = "Smith") {
return firstName + " " + lastName;
}
可选参数和默认参数的函数类型是相同的:(firstName: string, lastName?: string) => string。为了书写方便,默认参数写在后面比较好。
参数多的话也可以解构和展开,示例如下:
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
this
关于this的原理请看这里:理解js中的函数调用和this。
如果遇到this报错,可以通过添加this: void或者this: 类名 来解决。
注意下面这种直接用等号的写法是一种实验性的写法,es6并不支持,只在es7上做了提案。但是typescript和react都对这种写法做了支持.
//用浏览器的审查元素运行,会报错
class Handler {
onClickGood = () => { console.log(this); }
}
一般如果要用等号的话,我们需要写在constructor里面(注意要加this)。
//写在constructor里面
class Handler {
constructor() {
this.onClickGood = () => { console.log(this); }
}
}
let myHandler = new Handler();
myHandler.onClickGood();
函数重载
看下面的例子,注意前2个才是函数重载,最后一个是函数声明。在编译的时候,会逐一判断函数类型,如果这2个都不符合,就会报错。
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
// Check to see if we're working with an object/array
// if so, they gave us the deck and we'll pick the card
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// Otherwise just let them pick the card
else if (typeof x == "number") {
let pickedSuit = Math.floor(x / 13);
return { suit: suits[pickedSuit], card: x % 13 };
}
}
typescript handbook 学习笔记4的更多相关文章
- typescript handbook 学习笔记3
概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...
- typescript handbook 学习笔记2
概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...
- typescript handbook 学习笔记1
概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...
- typescript类(学习笔记非干货)
我们声明一个 Greeter类.这个类有3个成员:一个叫做greeting的属性,一个构造函数和一个greet方法. We declare a Greeter class. This class ha ...
- typescript接口(学习笔记非干货)
typescript的核心原则之一就是对所具有的shape类型检查结构性子类型化 One of the core principles of typescript is to check struct ...
- 【TypeScript】学习笔记 把一些需要记的记录一下
安装typescript: npm install -g typescript 启动typesctipt自动编译: tsc 文件名.ts --watch 函数参数默认值: 1.有默认值参数的,声明在最 ...
- typescript泛型(学习笔记非干货)
软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型, 这在创建大型系统时为你提供了十分灵活的功能. In softwa ...
- TypeScript语言学习笔记(2)
接口 // 在参数类型中定义约束 function printLabel(labelledObj: { label: string }) { console.log(labelledObj.label ...
- TypeScript语言学习笔记(1)
基本类型 // 布尔型(Boolean) let isDone: boolean = false; // 数值型(Number) let decimal: number = 6; let hex: n ...
随机推荐
- PowerDesign生成数据库
最近要忙期考,但还是决定每天抽点空来写CodeSmith的系列文章了,在此实在不敢用教程这个词语,毕竟自己对CodeSmith了解的也不是很多,有很多牛人都在博客园发布了不少关于CodeSmith的文 ...
- mysql 查询结果集按照指定的字段值顺序排序
mysql 查询结果如果不给予指定的order by ,那么mysql会按照主键顺序(innodb引擎)对结果集加以排序,那么最后的排序可能就不是你想要的排序结果. 举个例子,我要按照前端传过来的mo ...
- CentOS开机报错:sd 0:0:0:0: [sda] Assuming drive cache: write through
解决方法: vim /etc/default/grub 文件里去掉 rhgb 参数. [root@lb-nginx- ~/]#vim /etc/default/grub GRUB_TIMEOUT= G ...
- mysql学习笔记--表操作
一.显示所有表 1. 语法:show tables; 二.创建表 1. 语法:create table [if not exists] 表名( 字段名 数据类型 [null | not null] ...
- Linux权限赋予远程连接MySQL
1.mysql -u root -p (root)用户名 2.mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'r ...
- Codeforces Round #449 (Div. 2)
Codeforces Round #449 (Div. 2) https://codeforces.com/contest/897 A #include<bits/stdc++.h> us ...
- SpriteKit 关于categoryBitMask collisionBitMask contactTestBitMask 遇到的一些问题
手写copy一下官方解释 首先是categoryBitMask /** 定义了这个物理刚体是属于哪个类别的掩码 .在一个场景中的每个物理刚体可以分配给达到 32 不同的类别(参数 int bitmas ...
- 华为NB-IOT报告
转 https://blog.csdn.net/np4rHI455vg29y2/article/details/78958137 [NB-IoT]华为NB-IoT网络报告(完整版) 2018年01月0 ...
- 在java服务端判断请求是来自哪个终端
在servlet中,我们可以获取到HttpServletRequest,然后通过HttpServletRequest的getHeader("User-Agent")方法获取请求头中 ...
- Android开发日常-listview滚动方法梳理
listview滚动方法梳理 1.setSelection(position); 滚动到指定条目 2.setSelectionFromTop(position,y): 距离指定条目向下偏移y(像素) ...