typescript// 变量声明
let a: string = 'hello';
// 常量声明
const b: number = 100;
如果一个变量或常量的声明包含了初始值,ts便可根据初始值进行类型推断,此时可不显式指定其类型
number
:整数和浮点数string
boolean
:true
,false
元素类型[]
(如 number[]
){name: string, age: number, tel: string}
)any
:请注意不要把 TypeScript
用成 AnyScript
let frameRate: string | number
typescriptlet position: string = '东';
let price: number = 150;
let countable: boolean = true;
const numbers: number[] = [1, 2, 3, 4, 5];
const person: {name: string, age: number, tel: string} = {name: '张三', age: 18, tel: '199999999'};
let frameRate: string | number = 60;
?
进行标识format: string = 'avc'
若函数没有返回值,则可以使用void
作为返回值类型,其含义为空。函数的返回值类型可根据函数内容推断出来,因此可以省略不写。
typescriptfunction getVideoInfo(name: string, format: string = 'avc', frameRate: string | number, audioFormat?: string): string {
return `${name}.${format}, audio-${audioFormat}, ${frameRate}fps`;
}
必选参数要写在可选参数的前面,否则会报错:
A required parameter cannot follow an optional parameter.
typescriptlet numbers: number[] = [1, 2, 3, 4, 5]
numbers.forEach(function (number) {
console.log(number);
})
let numbers2: number[] = numbers.map(number => number + 1);
类(class)是面向对象编程语言中的一个重要概念。
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,其核心理念在于将程序中的数据与操作数据的方法有机地组织成对象,从而使程序结构更加模块化和易于理解。通过对象之间的协同合作,实现更为复杂的程序功能。
类(class)是对象的蓝图或模板,它定义了对象的属性(数据)和行为(方法)。通过类可以创建多个具有相似结构和行为的对象。
typescriptclass Person {
id: number;
name: string;
age: number = 18;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
introduce(): string {
return `hello,I am ${this.name},and I am ${this.age} years old`;
}
}
创建对象的关键字为 new
,可以访问对象身上的属性,并调用对象身上的方法
typescriptconsole.log(person.name); //读
person.name = 'lisi'; //写
console.log(person.name);
let intro = person.introduce();
console.log(intro);
静态成员隶属于类本身,而不属于某个对象实例,静态成员通常用于定义一些常量、工具方法
定义静态成员需要使用 static
关键字
静态成员无需通过对象实例访问,直接通过类本身访问即可
typescriptclass Constants {
static count: number = 1;
}
class Utils {
static toLowerCase(str: string) {
return str.toLowerCase();
}
}
console.log(Constants.count);
console.log(Utils.toLowerCase('Hello World'));
继承是面向对象编程中的重要机制,允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。派生类可以直接使用基类的特性,并根据需要添加新的特性或覆盖现有的特性。这种机制赋予面向对象程序良好的扩展性
typescriptclass Student extends Person {
classNumber: string;
constructor(id: number, name: string, classNumber: string) {
super(id, name);
this.classNumber = classNumber;
}
introduce(): string {
return super.introduce() + `, and I am a student`;
}
}
let student = new Student(1, 'xiaoming', '三年二班');
console.log(student.introduce());
extends
super()
调用父类构造器对继承自父类的属性进行初始化this
关键字访问继承自父类的属性和方法super
关键字访问父类定义的方法访问修饰符(Access Modifiers)用于控制类成员(属性、方法等)的可访问性。TypeScript 提供了三种访问修饰符,分别是 private
、protected
和 public
typescriptclass Person {
private id: number;
protected name: string;
public age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
}
接口( interface
)是面向对象编程中的另一个重要概念。接口通常会作为一种契约或规范让类( class
)去遵守,确保类实现某些特定的行为或功能。
接口使用 interface
关键字定义,通常情况下,接口中只会包含属性和方法的声明,而不包含具体的实现细节,具体的细节由其实现类完成
接口的实现需要用到 implements
关键字,实现类中,需要包含接口属性的赋值逻辑,以及接口方法的实现逻辑
typescriptinterface Person {
id: number;
name: string;
age: number;
introduce(): void;
}
class Student implements Person {
id: number;
name: string;
age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
introduce(): void {
console.log('Hello,I am a student');
}
}
多态是面向对象编程中的一个重要概念,它可以使同一类型的对象具有不同的行为
创建两个不同的类分别实现接口 Person
typescriptinterface Person {
id: number;
name: string;
age: number;
introduce(): void;
}
class Student implements Person {
id: number;
name: string;
age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
introduce(): void {
console.log('Hello,I am a student');
}
}
class Teacher implements Person {
id: number;
name: string;
age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
introduce(): void {
console.log('Hello,I am a teacher');
}
}
分别创建 Student
对象和 Teacher
对象,然后分别调用其中的 introduce
方法
typescriptlet p1: Person = new Student(1, 'zhangsan', 17);
let p2: Person = new Teacher(2, 'lisi', 35);
p1.introduce();//Hello,I am a student
p2.introduce();//Hello,I am a teacher
TypeScript 中的接口是一个非常灵活的概念,除了用作类的规范之外,也常用于直接描述对象的类型
typescriptinterface Person {
name: string;
age: number;
gender: string;
}
let person: Person = {name: '张三', age: 10, gender: '男'};
枚举(Enumeration)是编程语言中常见的一种数据类型,其主要功能是定义一组有限的选项,例如,方向(上、下、左、右)或季节(春、夏、秋、冬)等概念都可以使用枚举类型定义
枚举的定义需要使用 enum
关键字
typescriptenum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
案例:
typescriptenum Direction {
UP,
BOTTOM,
LEFT,
RIGHT
}
function move(direction: Direction) {
if (direction === Direction.UP) {
console.log('向上移动');
} else if (direction === Direction.BOTTOM) {
console.log('向下移动');
} else if (direction === Direction.LEFT) {
console.log('向左移动');
} else {
console.log('向右移动');
}
}
move(Direction.UP);
在 TypeScript 中,枚举实际上是一个对象,而每个枚举值都是该对象的一个属性,并且每个属性都有具体的值,属性值只支持两种类型——数字或字符串
默认情况下,每个属性的值都是数字,并且从 0
开始递增
通过为枚举属性赋值,可以赋予枚举属性一些更有意义的信息
typescriptenum Direction {
UP = 'up',
BOTTOM = 'bottom',
LEFT = 'left',
RIGHT = 'right'
}
enum Color {
Red = 0xFF0000,
Green = 0x00FF00,
Blue = 0x0000FF
}
enum FontSize {
Small = 12,
Medium = 16,
Large = 20,
ExtraLarge = 24
}
模块化是指将复杂的程序拆解为多个独立的文件单元,每个文件被称为一个模块。在 TypeScript 中,默认情况下,每个模块都拥有自己的作用域,这意味着在一个模块中声明的任何内容(如变量、函数、类等)在该模块外部是不可见的。为了在一个模块中使用其他模块的内容,必须对这些内容进行导入、导出。
typescriptexport function hello() {
console.log('hello module A');
}
export const str = 'hello world';
export const num = 1;
typescriptimport { hello, str } from './moduleA';
hello();
console.log(str);
若多个模块中具有命名相同的变量、函数等内容,将这些内容导入到同一模块下就会出现命名冲突
typescriptimport { hello as helloFromA, str as strFromA } from "./moduleA";
import { hello as helloFromC, str as strFromC } from "./moduleC";
helloFromA();
console.log(strFromA);
helloFromC();
console.log(strFromC);
typescriptimport * as A from "./moduleA";
import * as C from "./moduleC";
A.hello();
console.log(A.str);
C.hello();
console.log(C.str);
默认导出允许一个模块指定一个(最多一个)默认的导出项
typescriptexport default function hello(){
console.log('moduleA');
}
由于每个模块最多有一个默认导出,因此默认导入无需关注导入项的原始名称,并且无需使用 {}
typescriptimport helloFromA from "./moduleA";
由于默认导入时无需关注导入项的名称,所以默认导出支持匿名内容,比如匿名函数
本文作者:Morales
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 License 许可协议。转载请注明出处!