TypeScript的class概念和编译选项

2023-09-08  本文已影响0人  rebirth重生A

对象

面向对象是程序中一个非常重要的思想,它被很多同学理解成了一个比较难,比较深奥的问题,其实不然。面向对象很简单,简而言之就是程序之中所有的操作都需要通过对象来完成。

一切操作都要通过对象,也就是所谓的面向对象,那么对象到底是什么呢?这就要先说到程序是什么,计算机程序的本质就是对现实事物的抽象,抽象的反义词是具体,比如:照片是对一个具体的人的抽象,汽车模型是对具体汽车的抽象等等。程序也是对事物的抽象,在程序中我们可以表示一个人、一条狗、一把枪、一颗子弹等等所有的事物。一个事物到了程序中就变成了一个对象

在程序中所有的对象都被分成了两个部分数据和功能,以人为例,人的姓名、性别、年龄、身高、体重等属于数据,人可以说话、走路、吃饭、睡觉这些属于人的功能。数据在对象中被成为属性,而功能就被称为方法。所以简而言之,在程序中一切皆是对象

1、类(class)

要想面向对象,操作对象,首先便要拥有对象,那么下一个问题就是如何创建对象。要创建对象,必须要先定义类,所谓的类可以理解为对象的模型,程序中可以根据类创建指定类型的对象,举例来说:可以通过Person类来创建人的对象,通过Dog类创建狗的对象,通过Car类来创建汽车的对象,不同的类可以用来创建不同的对象。

class 类名 {
属性名: 类型;

    constructor(参数: 类型){
            this.属性名 = 参数;
    }
    
    方法名(){
            ....
    }

}

class Person{
name: string;
age: number;

constructor(name: string, age: number){
    this.name = name;
    this.age = age;
}

sayHello(){
    console.log(`大家好,我是${this.name}`);
}

}

const p = new Person('孙悟空', 18);
p.sayHello();

2、面向对象的特点

class Person{
public name: string; // 写或什么都不写都是public
public age: number;

constructor(name: string, age: number){
    this.name = name; // 可以在类中修改
    this.age = age;
}

sayHello(){
    console.log(`大家好,我是${this.name}`);
}

}

class Employee extends Person{
constructor(name: string, age: number){
super(name, age);
this.name = name; //子类中可以修改
}
}

const p = new Person('孙悟空', 18);
p.name = '猪八戒';// 可以通过对象修改

class Person{
protected name: string;
protected age: number;

constructor(name: string, age: number){
    this.name = name; // 可以修改
    this.age = age;
}

sayHello(){
    console.log(`大家好,我是${this.name}`);
}

}

class Employee extends Person{

constructor(name: string, age: number){
    super(name, age);
    this.name = name; //子类中可以修改
}

}

const p = new Person('孙悟空', 18);
p.name = '猪八戒';// 不能修改

class Person{
private name: string;
private age: number;

constructor(name: string, age: number){
    this.name = name; // 可以修改
    this.age = age;
}

sayHello(){
    console.log(`大家好,我是${this.name}`);
}

}

class Employee extends Person{

constructor(name: string, age: number){
    super(name, age);
    this.name = name; //子类中不能修改
}

}

const p = new Person('孙悟空', 18);
p.name = '猪八戒';// 不能修改

class Person{
private _name: string;

constructor(name: string){
    this._name = name;
}

get name(){
    return this._name;
}

set name(name: string){
    this._name = name;
}

}

const p1 = new Person('孙悟空');
console.log(p1.name); // 通过getter读取name属性
p1.name = '猪八戒'; // 通过setter修改name属性

class Tools{
static PI = 3.1415926;

static sum(num1: number, num2: number){
    return num1 + num2
}

}

console.log(Tools.PI);
console.log(Tools.sum(123, 456));

class Animal{
name: string;
age: number;

constructor(name: string, age: number){
    this.name = name;
    this.age = age;
}

}

class Dog extends Animal{

bark(){
    console.log(`${this.name}在汪汪叫!`);
}

}

const dog = new Dog('旺财', 4);
dog.bark();

class Animal{
name: string;
age: number;

constructor(name: string, age: number){
    this.name = name;
    this.age = age;
}

run(){
    console.log(`父类中的run方法!`);
}

}

class Dog extends Animal{

bark(){
    console.log(`${this.name}在汪汪叫!`);
}

run(){
    console.log(`子类中的run方法,会重写父类中的run方法!`);
}

}

const dog = new Dog('旺财', 4);
dog.bark();

abstract class Animal{
abstract run(): void;
bark(){
console.log('动物在叫~');
}
}

class Dog extends Animals{
run(){
console.log('狗在跑~');
}
}

3、接口(Interface)

接口的作用类似于抽象类,不同点在于接口中的所有方法和属性都是没有实值的,换句话说接口中的所有方法都是抽象方法。接口主要负责定义一个类的结构,接口可以去限制一个对象的接口,对象只有包含接口中定义的所有属性和方法时才能匹配接口。同时,可以让一个类去实现接口,实现接口时类中要保护接口中的所有属性。

interface Person{
name: string;
sayHello():void;
}

function fn(per: Person){
per.sayHello();
}

fn({name:'孙悟空', sayHello() {console.log(Hello, 我是 ${this.name})}});

interface Person{
name: string;
sayHello():void;
}

class Student implements Person{
constructor(public name: string) {
}

sayHello() {
    console.log('大家好,我是'+this.name);
}

}

4、泛型(Generic)

定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定),此时泛型便能够发挥作用。

function test(arg: any): any{
return arg;
}

function test<T>(arg: T): T{
return arg;
}

test(10)

test<number>(10)

function test<T, K>(a: T, b: K): K{
return b;
}

test<number, string>(10, "hello");

class MyClass<T>{
prop: T;

constructor(prop: T){
    this.prop = prop;
}

}

interface MyInter{
length: number;
}

function test<T extends MyInter>(arg: T): number{
return arg.length;
}

5、编译选项

tsc xxx.ts -w

"include":["src//", "tests//"]

"exclude": ["./src/hello/*/"]

"extends": "./configs/base"

"files": [
"core.ts",
"sys.ts",
"types.ts",
"scanner.ts",
"parser.ts",
"utilities.ts",
"binder.ts",
"checker.ts",
"tsc.ts"
]

"compilerOptions": {
"target": "ES6"
}

"compilerOptions": {
"target": "ES6",
"lib": ["ES6", "DOM"],
"outDir": "dist",
"outFile": "dist/aa.js"
}

"compilerOptions": {
"module": "CommonJS"
}

"compilerOptions": {
"outDir": "dist"
}

"compilerOptions": {
"outFile": "dist/app.js"
}

"compilerOptions": {
"rootDir": "./src"
}

"compilerOptions": {
"allowJs": true,
"checkJs": true
}

上一篇 下一篇

猜你喜欢

热点阅读