跳到主要内容

函数和类

函数

函数的类型签名

// 方式一
function foo(name: string): number {
return name.length;
}

// 方式二
type FuncFoo = (name: string, age: number) => number;


const foo: FuncFoo = name => {
return name.length;
}

// 方式三
interface FuncFooStruct {
(name: string, age: number): number;
}

const foo: FuncFooStruct = (name, age) => {
console.log(age);
return name.length;
};

重载

function func(foo: number, bar: true): string;
function func(foo: number, bar?: false): number;
function func(foo: number, bar?: boolean): string | number {
if (bar) {
return String(foo);
} else {
return foo * 599;
}
}

const res1 = func(599); // number
const res2 = func(599, true); // string
const res3 = func(599, false); // number
  • function func(foo: number, bar: true): string,重载签名一,传入 bar 的值为 true 时,函数返回值为 string 类型。
  • function func(foo: number, bar?: false): number,重载签名二,不传入 bar,或传入 bar 的值为 false 时,函数返回值为 number 类型。
  • function func(foo: number, bar?: boolean): string | number,函数的实现签名,会包含重载签名的所有可能情况。

异步函数、Generator 函数等类型签名

async function asyncFunc(): Promise<void> {}

function* genFunc(): Iterable<void> {}

async function* asyncGenFunc(): AsyncIterable<void> {}

Class

class Foo {
prop: string;

constructor(inputProp: string) {
this.prop = inputProp;
}

print(addon: string): void {
console.log(`${this.prop} and ${addon}`)
}

get propA(): string {
return `${this.prop}+A`;
}

set propA(value: string) {
this.prop = `${value}+A`
}
}

修饰符

class Foo {
private prop: string;

constructor(inputProp: string) {
this.prop = inputProp;
}

static staticHandler() { }

protected print(addon: string): void {
console.log(`${this.prop} and ${addon}`)
}

public get propA(): string {
return `${this.prop}+A`;
}

public set propA(value: string) {
this.propA = `${value}+A`
}
}
  • static:标识一个成员为静态成员。
  • public:此类成员在类、类的实例、子类中都能被访问。
  • private:此类成员仅能在类的内部被访问。
  • protected:此类成员仅能在类与子类中被访问。

继承、实现、抽象类

class Base {
print() { }
}

class Derived extends Base {
print() {
super.print()
// ...
}
}


class Derived2 extends Base {
// override 关键字,来确保派生类尝试覆盖的方法一定在基类中存在定义
override print() {
// ...
}
}

抽象类使用 abstract 关键字声明:

abstract class AbsFoo {
abstract absProp: string;
abstract get absGetter(): string;
abstract absMethod(name: string): string;
}

class Foo implements AbsFoo {
absProp: string = 'linbudu';

get absGetter() {
return 'linbudu';
}

absMethod(name: string) {
return name;
}
}