TypeScript 之 Class
class
private 和 # 的区别
class Bag { private item: any }
class Bag { #item: any }
类型和值(Type and Value)
class Bag { }
const a: Bag = new Bag()
class C implements Bag { }
常用语法(common Syntax)
class User {
name: string // 必须声明才能在 constructor 赋值
constructor(name: string) {
this.name = name
}
}
以下是上面简写,public 可换成 private ,public readonly,protected, 等等......,但不能是 js 语法 static 和 # 修饰符
class User {
constructor(public name:string){}
}
其它常用语法
interface Updatable { }
type Serializzable = {}
class Account { }
// 继承 Account 类,实现 Updatable 接口 和 Serializzable 类型
class User extends Account implements Updatable, Serializzable {
id: string;
displayName?: boolean; // 可选
name!: string; // 告诉类型检查器 name 有值
#attributes: Map<any, any>; // 私有属性,js语法
roles = ["user"]; // 默认值
readonly createdAt = new Date(); //只读属性
constructor(id: string) {
super()
this.id = id
this.#attributes = new Map()
}
setName(name: string) { this.name = name } // 原型方法
verifyName = (name: string) => { this.name = name } // 实例方法
// 函数重载
sync(): Promise<{}>
sync(cb: (result: string)=>void): void
// 方法类型声明完成,后要接着方法实现
sync(cb?: (result: string)=>void): void | Promise<{}>{}
// Getters and Setters
get accountID(){return 123}
set accountID(value: number){ /** ... */ }
// protected 只能在类和继承类的后代类中使用,不可以在实例中使用
protected handleReques(){}
// 静态类型,js语法
static #userCount = 0 // 只能在静态方法里使用
static registerUser(user: number){this.#userCount = user}
}
泛型(Generics)
class Box<Type>{
constructor(public content:Type){}
}
const stringBox = new Box("a package")
// stringBox: Box<string>
抽象类(Abstract Classes)
abstract class Base {
abstract getName(): string;
printName() {
console.log("Hello, " + this.getName());
}
}
const b = new Base(); // 错误,无法创建抽象类的实例。
class Derived extends Base {
// 必须实现该抽象函数
getName() {
return "world";
}
}
const d = new Derived();
d.printName();
抽象构造签名(Abstract Construct Signatures)
function greet(ctor: typeof Base) {
const instance = new ctor(); // 无法创建抽象类的实例。
instance.printName();
}
greet(Base);
function greet2(ctor: new () => Base) {
const instance = new ctor();
instance.printName();
}
greet2(Derived);
greet2(Base);
抽象类继承抽象类
abstract class Base {
abstract getName(): string;
abstract asd: string
printName() {
console.log("Hello, " + this.getName());
}
}
abstract class Bag extends Base {
abstract getName(): any; // 相同抽象方法,返回值改为any,不报错
abstract asd: '456' // 相同抽象字段,返回值改为 string 子类型,不报错
}
class Derived extends Bag {
constructor(public asd: '456') {
super()
}
getName() {
return 123;
}
}
const d = new Derived('456');
d.printName();
class Derived extends Bag, Base {} // 错误
修饰器和属性(Decorators and Attributes)
import { Syncable, triggerSync, preferCache, required } from "mylib"
@Syncable
class User {
@triggerSync() // 方法
save() { }
@preferCache(false) // 访问器
get displayName() { }
update(@required info: Partial<User>) { } // 方法参数
}
function first(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("first(): called");
};
function second(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("second(): called");
};
class ExampleClass {
// 单行,多行,两种写法
@first @second method() { }
// @first
// @second
// method() { }
}
const exampleClass = new ExampleClass();
exampleClass.method()
// second(): called
// first(): called
function first() {
console.log("first(): factory evaluated");
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("first(): called");
};
}
function second() {
console.log("second(): factory evaluated");
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("second(): called");
};
}
class ExampleClass {
@first()
@second()
method() { }
}
const exampleClass = new ExampleClass();
exampleClass.method()
// first(): factory evaluated
// second(): factory evaluated
// second(): called
// first(): called
Decorator Evaluation
- 实例成员,(参数装饰器,其次是方法),(访问器),(属性装饰器), 这三者按照声明顺序调用
- 静态成员,(参数装饰器,其次是方法),(访问器),(属性装饰器), 这三者按照声明顺序调用
- 构造函数参数修饰器
- 类修饰器
function classDecorator(constructor: Function) {
console.log("classDecorator");
};
function propertyDecorator(name: string) {
return function (target: any, propertyKey: string) {
console.log(name);
}
}
function parameterDecorator(name: string) {
return function (target: any, functionName: string, index: number) {
console.log(name);
}
}
function methodDecorator(name: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(name);
};
}
function accessorDecorator(name: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(name);
}
}
@classDecorator
class ExampleClass {
constructor(@parameterDecorator("constructorParameter") greeting: string, @parameterDecorator("constructorParameter2") public appService: string) {
this.greeting = greeting
}
@accessorDecorator("staticAccessor") static get x() {return 123}
@propertyDecorator("staticProperty") static id: number
@methodDecorator("staticMethod")
static smethod(@parameterDecorator('staticParmeter') value: string) { }
@propertyDecorator("instanceProperty") greeting: string
@methodDecorator("instanceMethod")
method(value: string, @parameterDecorator('instanceParmeter') value2: string) { }
@accessorDecorator("instanceAccessor") get x() {return 123}
}
const exampleClass = new ExampleClass('asd', 'wew');
exampleClass.method('a', 'b')
// [LOG]: "instanceProperty"
// [LOG]: "instanceParmeter"
// [LOG]: "instanceMethod"
// [LOG]: "instanceAccessor"
// [LOG]: "staticAccessor"
// [LOG]: "staticProperty"
// [LOG]: "staticParmeter"
// [LOG]: "staticMethod"
// [LOG]: "constructorParameter2"
// [LOG]: "constructorParameter"
// [LOG]: "classDecorator"
感谢观看,欢迎互相讨论与指导,以下是参考资料链接
https://www.typescriptlang.org/static/TypeScript%20Classes-83cc6f8e42ba2002d5e2c04221fa78f9.png
TypeScript 之 Class的更多相关文章
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
- TypeScript为Zepto编写LazyLoad插件
平时项目中使用的全部是jQuery框架,但是对于做webapp来说jQuery太过于庞大,当然你可以选择jQuery 2.*针对移动端的版本. 这里我采用移动端使用率比较多的zepto框架,他跟jqu ...
- TypeScript Vs2013 下提示Can not compile modules unless '--module' flag is provided
VS在开发TypeScript程序时候,如果import了模块有的时候会有如下提示: 这种情况下,只需要对当前TypeScript项目生成设置为AMD规范即可!
- TypeScript
TypeScript: Angular 2 的秘密武器(译) 本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch? ...
- 打造TypeScript的Visual Studio Code开发环境
打造TypeScript的Visual Studio Code开发环境 本文转自:https://zhuanlan.zhihu.com/p/21611724 作者: 2gua TypeScript是由 ...
- 转职成为TypeScript程序员的参考手册
写在前面 作者并没有任何可以作为背书的履历来证明自己写作这份手册的分量. 其内容大都来自于TypeScript官方资料或者搜索引擎获得,期间掺杂少量作者的私见,并会标明. 大部分内容来自于http:/ ...
- Webstorm编译TypeScript
下载webstorm 下载node.js编译器npm Webstorm的安装很简单.但如果没有Java For Mac 环境打开Webstorm时会有提示,点击提示会跳转下载链接,下载安装就好. ...
- CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)
CSS不像其它高级语言一样支持算术运算.变量.流程控制与面向对象特性,所以CSS样式较多时会引起一些问题,如修改复杂,冗余,某些别的语言很简单的功能实现不了等.而javascript则是一种半面向对象 ...
- 使用TypeScript拓展你自己的VS Code!
0x00 前言 在前几天的美国纽约,微软举行了Connect(); //2015大会.通过这次大会,我们可以很高兴的看到微软的确变得更加开放也更加务实了.当然,会上放出了不少新产品和新功能,其中就包括 ...
- 产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...
随机推荐
- 使用shell做http web接口,可以传递参数--废弃
此文章废弃,参考另一篇 参考网址: https://me.jinchuang.org/archives/114.html https://www.cnblogs.com/jinchuang/p/142 ...
- vivo 公司 Kubernetes 集群 Ingress 网关实践
文章转载自:https://mp.weixin.qq.com/s/qPqrJ3un1peeWgG9xO2m-Q 背景 vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经 ...
- PAT (Basic Level) Practice 1029 旧键盘 分数 20
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...
- 我的 Kafka 旅程 - Consumer
kafka采用Consumer消费者Pull主动拉取数据的方式,当Broker无数据时,消费者空转.Kafka并不删除已消费的消息,各自独立的消费者可消费同一个Broker分区数据. 消费流程 1.消 ...
- 【Wine使用经验分享】Wine字体显示问题处理
字体不显示/字体为□ 首先尝试下载simsun字体到/usr/share/fonts (simsun.ttf simsun.ttc) 在新版本wine上,差不多就能解决问题. 如果还不行,就从网上下载 ...
- Java程序设计(三)作业
题目1:用户输入学号,如果是以ccutsoft开头,并且后边是4位数字,前两位大于06小于等于当前年份.判断用户输入是否合法.ccutsoft_0801. 1 //题目1:用户输入学号,如果是以abc ...
- win10 python 环境搭建
1.在官网上下载python安装程序:www.python.org 官网是英文的,程序自己慢慢找就好了.因为机子是64位的,所以必须下载64位的pyhon安装程序,另外我这里下的是python版本是2 ...
- Python编程之多进程(multiprocessing)详解
引言 multiprocessing是一个用于产生多进程的包,与threading模块的API类似.multiprocessing既可以实现本地的多进程,也可以实现远程的多进程.通过使用多个子进程而非 ...
- 华为路由器NAT基本配置命令
NAT地址转换 静态 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]nat static global 202.169.10.5 inside 172.16.1.1 ...
- 面向对象day02,作业学生类,电脑类
学生类,电脑类,测试类 学生类:解释都写在注释里面 public class Student { public String name; public int id; public char gend ...