为了方便后面代码的测试,简单的实现对文件内容进行监测后自动编译
tsconfig.json
文件配置如下{
"include":["./src/**/*"],
"compilerOptions":{
"module": "es2015",
"target": "es2015",
"strict": true,
"outDir": "./dist",
"noEmitOnError":true
}
}
tsc -w
命令class Person{
// 实例属性
name:string = ‘唐僧‘;
// 静态属性
static country:string = ‘China‘;
// 只读属性
readonly sex:string = ‘male‘;
static readonly color:string = ‘yellow‘:
// 静态方法
static sayHi(){
console.log(‘say hi‘)
}
// 实例方法
sayName(){
console.log(‘okkk‘)
}
}
let p1 = new Person()
console.log(p1.name);
// p1.sex = ‘update‘
console.log(Person.country);
//Person.color = ‘pink‘
p1.sayHi()
注意:
new 类名()
时会调用类中的constructor方法class Dog{
name:string;
constructor(name:string){
this.name = name;
}
bark(){
console.log(this.name+‘ is barking...‘)
}
}
let d1 = new Dog(‘旺财‘)
d1.bark()
class Animal{
name:string;
constructor(name:string){
this.name = name;
}
shout(){
console.log("动物在叫唤")
}
}
class Cat extends Animal{
shout(){
console.log(this.name+‘在叫‘)
}
}
在开发中我们会经常使用到别人的类(比如:框架的),但是别人的类并不是完全满足我们的需求,我们不会轻易的改动别人的类,如果改动了别人的类可能会导致在其他地方使用到这个类时报错的问题。比如:我们需要4个功能,但是A类只有3个功能,我们可以创建新类去继承这个类,然后在新类中添加新的功能----继承可以对新的类进行扩展。简而言之,可以新增原来不存在的功能,或者覆盖父类中不满足子类要求的方法
super.
方式访问的话,会调用父类实例中的属性或方法super
,否则报错class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
sayHello() {
console.log("动物再叫~")
}
}
class Dog extends Animal {
age: number;
constructor(name: string, age: number) {
super(name);
this.age = age;
}
sayHello() {
console.log(‘喵喵叫‘)
}
}
let d1 = new Dog(‘旺财‘, 12)
d1.sayHello()
abstract
关键字定义抽象类,没有方法体abstract class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
abstract sayHello(): void;
}
class Dog extends Animal {
sayHello() {
console.log(‘旺旺旺‘)
}
}
let d1 = new Dog(‘阿久‘)
d1.sayHello()
interface Person {
name: string;
age: number;
}
interface Person {
weight: number;
}
const obj: Person = {
name: ‘如沐春风‘,
age: 20,
weight: 1.88
}
interface myInter{
name: string;
sayHello():void;
}
// 类实现接口
class MyClass implements myInter {
name: string;
constructor(name: string) {
this.name = name;
}
sayHello() {
console.log(‘大家好~~‘);
}
}
class Person{
private _age:number;
constructor(age:number){
this._age = age;
}
// 获取
getAge(){
return this._age
}
// 设置
setAge(age:number){
//只有在age合法的情况下才进行操作
if(age>=0){
this._age = age
}
}
}
const p1 = new Person(20)
//p1._age = -30
p1.setAge(-30)
console.log(p1)
ts为了简化程序员频繁的编写getter和setter代码,允许使用下面的简便方式
class Person{
private _age:number;
constructor(age:number){
this._age = age;
}
get age(){
return this._age;
}
set age(value:number){
if(value >=0){
this._age = value
}
}
}
const p2= new Person(20)
console.log(p2)
p2.age = -33 //这里会调用"set age"
console.log(p2)
注意:
属性修饰符
class A{
protected num: number;
constructor(num: number) {
this.num = num;
}
}
class B extends A{
test(){
console.log(this.num);
}
}
const b = new B(123);
// b.num = 33; 报错,不能是类外修改
可以直接将属性定义在构造函数中
class C{
public name:string;
constructor(name:string){
this.name = name;
}
}
等价于下面
class C{
constructor(public name:string){
this.name = name;
}
}
// 泛型定义
function fn<T>(a: T): T {
return a
}
// 调用时可以指定泛型或者不指定泛型
let n = fn<number>(10)
let n1 = fn(10)
// 泛型可以同时指定多个
function fn2<M, N>(a: M, b: N): N {
console.log(a);
return b
}
fn2(10, ‘hello‘)
泛型与继承结合
interface Inter {
length: number;
}
// 指定泛型T必须是Inter的子类或实现类 【可以是包含有Inter接口规范的类】
function fn3<T extends Inter>(a: T): number {
return a.length
}
f3("hello") //这里可以执行,因为字符串中含有length属性
f3(123) //报错
f3({length:10})
泛型与类结合
class myClass<T>{
name: T;
constructor(name: T) {
this.name = name
}
}
let m = new myClass(‘hello‘)
原文:https://www.cnblogs.com/it774274680/p/15111099.html