Typescript-6.类

类:
class Greeter{
	greeting:string;
	constructor(message: string){
		this.greeting = message;
	}
	greet(){
		return "Hello, " + this.greeting;
	}
}
let greeter = new Greeter("world");
继承
在ts里,我们可以使用常用的面向对象模式。
基于类的设计模式中一种最基本的模式是允许使用继承来扩展现有的类。
class Animal{
	move(distanceInMeters: number = 0){
		console.log('Animal moved ${distanceInMeters}m.');
	}
}

class Dog extends Animal{
	bark(){
		console.log('Woof! Woof!');
	}
}
const dog = new Dog();
dog.bark();
dog.move(10);
========================================
class Animal{
	name:string;
	constructor(theName:string){
		this.name = theName;
	};
	move(distanceInMeters : number = 0){
		console.log('${this.name} moved ${distanceInMeters}m');
	}
}
class Snake extends Animal{
	constructor(name:string){
		super(name);
	}
	move(distanceInMeters : number = 0){
		console.log('${this.name} moved ${distanceInMeters}m');
		super.move(distanceInMeters);
	}
}
class Horse extends Animal {
    constructor(name: string) { super(name); }
    move(distanceInMeters = 45) {
        console.log("Galloping...");
        super.move(distanceInMeters);
    }
}
let sam = new Snake("Sammy the Python");
let tom: Animal = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
公共,私有与受保护的修饰符
默认为public
protected子类可以访问
class Animal{
	constructor(private name: string){
		
	}
	move(distanceInMeters : number){
		console.log(`${this.name} moved ${distanceInMeters}m.`);
	}
	
}
readonly修饰符
你可以使用readonly关键字将属性设置为只读的。只读属性必须在声明时或者构造函数里被初始化


参数属性
在上面的例子中,我们不得不定义一个受保护的成员name和一个构造函数参数theName在Person类里,并且立刻将theName的值付给name。
class Animal{
	constructor(private name : string){
	}
	move(distanceInMeters: number){
		//......
	}
	
}
存取器
class Employee{
	private _fullName : string;
	
	get fullName():string{
		return this._fullName;
	}
	set fullName(newName : string){
		if(password == "password"){
			this._fullName = newName;
		}else{
			console.log("Error: Unauthorized update of employee!");
		}
	}
}
静态属性
class Gird{
	static origin = {x : 0,y: 0};
	calculateDistanceFromOrgin(point:{x:number;y:number;}){
		let xDist = (point.x - Gird.origin.x);
		let yDist = (point.y - Gird.origin.y);
		return Math.sqrt(xDist * xDist + yDist * yDist)/this.scale;
	}
	constructor(public scale: number){
		
	}
	
}

let grid1 = new Grid(1.0);
let gri = new Grid(5.0);
console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
抽象类
抽象类做为其它派生类的基类使用。他们一般不会直接被实例化。
不同于接口,抽象类可以包含成员的实现细节。
abstract class Department {
    constructor(public name: string) {
    }

    printName(): void {
        console.log('Department name: ' + this.name);
    }

    abstract printMeeting(): void; // 必须在派生类中实现
}


class AccountingDepartment extends Department {

    constructor() {
        super('Accounting and Auditing'); // 在派生类的构造函数中必须调用 super()
    }


    printMeeting(): void {
        console.log('The Accounting Department meets each Monday at 10am.');
    }


    generateReports(): void {
        console.log('Generating accounting reports...');
    }
}


let department : Department;//允许创建一个对抽象类的引用
department = new Department();//error
department = new AccountingDepartment();
高级技巧
构造函数
当你在TypeScript里声明了一个类的时候,实际上同时声明了很多东西。
class Greeter{
	greeting: string;
	constructor(message: string){
		this.greeting 
	}
}
把类当做接口使用
如上一节里所讲,类定义会创建两个东西:类的实例类型和一个构造函数。
因为类可以创建出类型,所以你能够在允许使用接口的地方使用类。
class Point{
	x : number;
	y : number;
}

interface Point3d extends Point{
	z:number;
}

let point3d: Point3d = {x:1 ,y:2,z:3};
<think> 我们正在解决一个npm安装yarn时出现的ERESOLVE错误,该错误与eslint版本冲突有关。具体来说,eslint@9.36.0与@typescript-eslint/parser@5.62.0的peer eslint版本要求冲突。 根据引用[1][2][5]中的信息,我们知道这错误通常是由于peer依赖版本不兼容造成的。引用[2]和[5]提到了两种解决方法:使用`--force`或`--legacy-peer-deps`参数,或者解决上游依赖冲突。 然而,我们这里是要安装yarn,但错误却与eslint有关,这可能是由于当前项目已经存在一些依赖,而安装yarn时触发了依赖树解析问题。但注意,用户要求安装的是yarn(一个包管理器),通常我们不会在项目内安装yarn,而是全局安装。所以这里需要明确用户是否是在项目内安装yarn?如果是,可能没有必要(除非是作为开发依赖,比如测试yarn本身)。但更常见的是全局安装。 但是,错误信息提到了eslint和@typescript-eslint/parser,这表明错误是在项目目录中安装时发生的。因此,我们需要澄清:用户是否在项目目录下运行`npm install yarn`?如果是,那么npm会尝试将yarn作为开发依赖安装到项目中,同时会检查项目的现有依赖是否兼容。 根据错误信息,冲突是: - eslint@9.36.0(当前已安装或将要安装的版本) - @typescript-eslint/parser@5.62.0 需要peer eslint版本在一个特定的范围内,而9.36.0可能不在这个范围内。 具体来说,我们需要检查@typescript-eslint/parser@5.62.0所要求的eslint版本范围。通常,在npm包中,peerDependencies会指定兼容的版本范围。 我们可以通过以下步骤解决: 1. 确认冲突的版本要求: - eslint@9.36.0 - @typescript-eslint/parser@5.62.0:我们可以查看它的peerDependencies,看它要求的eslint版本范围。 2. 解决方法: a. 考虑升级或降级eslint,以满足@typescript-eslint/parser的要求。 b. 或者升级@typescript-eslint/parser,使其支持eslint v9。 c. 使用`--legacy-peer-deps`参数强制安装(跳过peer依赖检查),但这可能导致运行时问题。 d. 使用`--force`参数强制覆盖。 但是,由于我们正在安装yarn,而yarn本身可能并不依赖于eslint,所以这个冲突可能是由于项目中已有的依赖引起的。因此,我们需要决定:安装yarn是否是必须的?如果是全局安装,则应该使用`npm install -g yarn`,这样就不会涉及项目中的依赖。 所以,首先建议用户尝试全局安装: ```bash npm install -g yarn ``` 如果用户确实需要在项目中安装yarn(作为开发依赖,例如用来确保团队使用相同的包管理器版本),那么我们需要解决项目中的eslint冲突。 步骤: 1. 检查项目中package.json里eslint和@typescript-eslint/parser的版本。 2. 确保这两个包版本兼容。 根据历史经验,@typescript-eslint/parser的版本需要与eslint版本匹配。通常,我们需要查看@typescript-eslint/parser的发布说明,看看它支持哪些eslint版本。 例如,@typescript-eslint/parser@5.x 不支持eslint v9,因为它是在eslint v9之前发布的。支持eslint v9的@typescript-eslint/parser版本需要v6及以上。 因此,解决方案可以是: - 将eslint降级到v8(因为v9是最新的,可能很多插件还没适配) - 或者升级@typescript-eslint/parser到v6.x(如果存在且兼容eslint v9) 但是,我们首先要查看当前项目中安装的eslint和@typescript-eslint/parser版本。 如果用户不想改变项目中的依赖,那么可以尝试用`--legacy-peer-deps`参数安装yarn: ```bash npm install yarn --legacy-peer-deps ``` 总结:根据引用[5]的建议,使用`--legacy-peer-deps`可以忽略peer依赖检查,从而完成安装。但需要注意,这只是一个临时解决方案,项目中的eslint依赖冲突仍然存在,可能会影响后续使用。 因此,我们给出两种方案: 方案一(推荐):全局安装yarn,避免项目依赖问题。 ```bash npm install -g yarn ``` 方案二:如果必须在项目中安装yarn,则尝试: a. 解决eslint依赖冲突: 1. 升级@typescript-eslint/parser到支持eslint v9的版本(v6.x及以上) 2. 或者降级eslint到v8(确保与@typescript-eslint/parser@5.62.0兼容) 具体操作: 降级eslint:`npm install eslint@8.x` 或升级@typescript-eslint/parser:`npm install @typescript-eslint/parser@latest` 注意:升级或降级后,可能需要更新其他相关的eslint插件,以保持版本一致。 b. 如果暂时不想解决冲突,使用`--legacy-peer-deps`安装: ```bash npm install yarn --legacy-peer-deps ``` 注意:引用[2]还提到使用`--force`,但`--force`通常用于强制重新安装或覆盖本地缓存,而`--legacy-peer-deps`是专门用于绕过peer依赖冲突的。 因此,优先推荐使用`--legacy-peer-deps`。 此外,如果用户的项目中还没有固定eslint版本,也可以尝试通过添加eslint的合适版本来解决。 最后,建议用户检查项目是否真的需要安装yarn作为依赖。通常,yarn作为包管理器,全局安装即可。 根据引用[1][2][5]的提示,我们可以总结出这些解决方案。 由于用户没有给出具体的package.json内容,我们只能给出一般性建议。 </think> ### 解决 npm 安装 yarn 时的 ESLint 版本冲突 根据您提供的错误信息和引用内容,该问题是由于 ESLint 9.36.0 与 @typescript-eslint/parser@5.62.0 的 peer 依赖版本不兼容导致。以下是具体解决方案: #### 核心问题分析 1. **冲突根源** - `@typescript-eslint/parser@5.62.0` 要求 peer ESLint 版本为 `^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值