TypeScript 是一种由微软开发的静态类型编程语言,它可以作为 JavaScript 的超集使用,并且可以在编译时进行类型检查。TypeScript 提供了更强大的工具和功能,使开发者能够更轻松地编写可维护、可扩展的代码。本文将详细介绍 TypeScript 基础语法的各个方面,让您能够快速上手 TypeScript 开发。
变量声明
在 TypeScript 中,可以使用 let
和 const
关键字来声明变量。与 JavaScript 不同,TypeScript 还引入了 var
关键字,但通常建议使用 let
或 const
来声明变量。
- 使用
let
声明的变量可以被重新赋值,而且只在块级作用域内有效。 - 使用
const
声明的变量是常量,不可被重新赋值,而且只在块级作用域内有效。
例如:
let x: number = 10;
const y: string = "Hello";
基本数据类型
TypeScript 支持与 JavaScript 相同的基本数据类型,包括 number
、string
、boolean
、null
、undefined
和 symbol
。
此外,TypeScript 还引入了一些新的数据类型,如 any
、void
、never
和 unknown
:
any
类型表示可以是任意类型的值,它与 JavaScript 的动态类型类似。void
类型表示没有返回值的函数。never
类型表示永远不会有返回值的函数或者总是会抛出异常的表达式。unknown
类型表示未知类型的值,它比any
更加严格。
例如:
let num: number = 123;
let str: string = "Hello";
let isTrue: boolean = true;
let nothing: null = null;
let undef: undefined = undefined;
let someValue: any = 42;
let result: void = undefined;
let error: never = (function () {
throw new Error("Error"); })();
let unknownValue: unknown = "Unknown";
函数
在 TypeScript 中,可以使用 function
关键字来定义函数。函数可以指定参数类型和返回值类型。
例如:
function add(x: number, y: number): number {
return x + y;
}
除了普通函数外,TypeScript 还支持箭头函数的写法:
const multiply = (x: number, y: number): number => {
return x * y;
};
类
TypeScript 是面向对象的编程语言,支持类的定义和继承。可以使用 class
关键字来定义类,并使用 extends
关键字来实现继承。
例如:
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
sayHello(): void {
console.log(`Hello, I'm ${
this.name}`);
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
bark(): void {
console.log("Woof!");
}
}
const myDog = new Dog("Max", "Labrador");
myDog.sayHello(); // 输出:Hello, I'm Max
myDog.bark(); // 输出:Woof!
接口
接口是 TypeScript 中用来定义对象的结构和类型的一种机制。可以使用 interface
关键字来定义接口。
例如:
interface Person {
name: string;
age: number;
}
function greet(person: Person): void {
console.log(`Hello, ${
person.name}! You are ${
person.age} years old.`);
}
const john: Person = {
name: "John", age: 25 };
greet(john); // 输出:Hello, John! You are 25 years old.
接口还可以包含可选属性和只读属性,以及支持函数类型和索引签名等高级特性。
泛型
泛型是 TypeScript 中一种强大的类型系统功能,它可以在编译时实现类型安全的参数化类型。
例如:
function identity<T>(value: T): T {
return value;
}
const result1 = identity<string>("Hello"); // 类型推断为 string
const result2 = identity<number>(42); // 类型推断为 number
泛型还可以应用于类、接口和类型别名等各个方面,使得代码更加灵活和可重用。
模块
TypeScript 支持模块化的开发方式,可以将代码组织成多个模块,并使用 export
和 import
关键字来导出和导入模块。
例如:
// math.ts
export function add(x: number, y: number): number {
return x + y;
}
// app.ts
import {
add } from "./math";
console.log(add(1, 2)); // 输出:3
模块化的开发方式可以提高代码的可维护性和可复用性,同时也能避免命名冲突和全局变量污染的问题。
类型推断
TypeScript 具有强大的类型推断能力,它能够根据上下文自动推断出变量或表达式的类型。
例如:
let x = 10; // 类型推断为 number
let str = "Hello"; // 类型推断为 string
function multiply(x: number, y: number) {
return x * y; // 类型推断为 number
}
const result = multiply(2, 3); // 类型推断为 number
类型推断可以减少代码中的冗余,提高开发效率。
类型断言
类型断言是一种告诉编译器某个值的类型的方式。可以使用 <类型>
或者 值 as 类型
的语法进行类型断言。
例如:
let someValue: unknown = "Hello";
let strLength1: number = (<string>someValue).length;
let strLength2: number = (someValue as string).length;
类型断言可以用于解决一些类型检查器无法确定的情况,但要谨慎使用,以避免类型错误。
装饰器
装饰器是一种用来修改类、方法、属性或参数的声明的元编程特性。可以使用 @装饰器名称
的语法将装饰器应用到对应的声明上。
例如:
function log(target: any, key: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling ${
key} with arguments: ${
args}`);
const result = originalMethod.apply(this, args);
console.log(`${
key} returned: ${
result}`);
return result;
};
return descriptor;
}
class Calculator {
@log
add(x: number, y: number): number {
return x + y;
}
}
const calculator = new Calculator();
calculator.add(2, 3); // 输出:Calling add with arguments: 2,3 /n add returned: 5
装饰器可以用于实现日志记录、性能分析、权限验证等各种功能,扩展了 TypeScript 的灵活性和可扩展性。
总结
本文详细介绍了 TypeScript 的基础语法,包括变量声明、基本数据类型、函数、类、接口、泛型、模块、类型推断、类型断言和装饰器等方面。TypeScript 提供了更加丰富的功能和工具,使得开发者可以更轻松地编写可维护、可扩展的代码。