送给TypeScript初学开发者的 10 个 Typescript 技巧
启用严格模式
TypeScript 最好的特性之一是其严格的类型检查系统。通过启用严格模式,TypeScript 将执行更彻底的类型检查并提供更好的错误消息。要启用严格模式,请将 "strict": true 选项添加到您的 tsconfig.json 文件:
{
"compilerOptions": {
"strict": true
}
}
从项目一开始就启用严格模式将帮助您尽早发现潜在错误并确保更好的代码质量。
使用显式类型
TypeScript 是关于类型的,所以在定义类型时明确是很重要的。避免依赖类型推断并显式指定变量、函数参数和返回值的类型。这提高了代码的可读性,并使其他开发人员更容易理解您的代码。例如:
function addNumbers(a: number, b: number): number {
return a + b;
}
使用好接口
TypeScript 中的接口允许您定义对象的形状并指定其属性的类型。它们是创建可重用和可维护代码的强大工具。考虑为复杂数据结构定义接口,而不是使用内联类型注释。例如
interface User {
name: string;
age: number;
email: string;
}
function sendEmail(user: User) {
// ...
}
使用联合类型和类型保护
联合类型允许您定义可以具有多种类型的变量。这在处理变量可能具有不同可能值的情况时很有用。类型保护,例如 typeof 和 instanceof ,帮助您缩小条件块中的类型。这是一个例子:
type Shape = 'circle' | 'square' | 'triangle';
function getArea(shape: Shape, size: number): number {
if (shape === 'circle') {
return Math.PI * size * size;
} else if (shape === 'square') {
return size * size;
} else if (shape === 'triangle') {
return (Math.sqrt(3) / 4) * size * size;
}
}
const area = getArea('circle', 5);
通过使用联合类型和类型保护,您可以编写更灵活、更健壮的代码来处理不同的场景。
解构对象和数组
解构是 TypeScript 中的一项便利功能,可让您从对象和数组中提取值。它可以使您的代码更加简洁和可读。您可以将它们解构为单独的变量,而不是直接访问对象属性或数组元素。这是一个例子:
interface Person {
name: string;
age: number;
address: string;
}
function greet(person: Person) {
const { name, age } = person;
console.log(`Hello, ${name}! You are ${age} years old.`);
}
const user = { name: 'Alice', age: 25, address: '123 Main St' };
greet(user);
解构不仅可以简化您的代码,还可以减少重复访问对象或数组的需要。
将泛型用于可重用代码
泛型允许您创建适用于不同类型的可重用代码组件。它们允许您在函数、类和接口中参数化类型,从而提供灵活性和类型安全性。通过使用泛型,您可以编写可以处理各种数据类型的函数或类,同时保持类型安全。这是一个例子:
function identity<T>(value: T): T {
return value;
}
const result = identity<number>(42);
在此示例中, identity 函数使用泛型类型参数 T 来指示它可以接受和返回任何类型。调用函数时,您可以显式指定类型(例如 identity(42) )或让 TypeScript 根据参数推断类型。
使用类型断言
类型断言是一种在您拥有比类型检查器更多的信息时告诉 TypeScript 编译器值的特定类型的方法。它允许您覆盖推断的类型并将该值视为不同的类型。谨慎使用类型断言,并且仅当您对类型兼容性有信心时才使用。这是一个例子:
let value: any = 'Hello, TypeScript!';
let length: number = (value as string).length;
在这种情况下,使用 as 关键字将 value 显式断言为字符串。这允许访问特定于字符串的 length 属性。
使用类型推断
TypeScript 具有强大的类型推断能力,这意味着它可以根据变量的值自动推断出变量的类型。您可以利用类型推断来减少对显式类型注释的需求,从而使您的代码更加简洁和可读。这是一个例子:
let message = 'Hello, TypeScript!';
// TypeScript infers the type of 'message' as string
let numbers = [1, 2, 3, 4, 5];
// TypeScript infers the type of 'numbers' as number[]
在这些示例中,TypeScript 根据分配的值推断变量的类型。但是,请注意,显式类型注释对于提高代码清晰度仍然很有用,尤其是在复杂的场景中。
使用可选和默认函数参数
TypeScript 允许您通过在参数名称后添加 ? 来定义可选函数参数。这使您能够在调用函数时提供默认值或使某些参数可选。这是一个例子:
function greet(name: string, greeting?: string) {
if (greeting) {
console.log(`${greeting}, ${name}!`);
} else {
console.log(`Hello, ${name}!`);
}
}
greet('Alice'); // Hello, Alice!
greet('Bob', 'Hi'); // Hi, Bob!
在这种情况下, greeting 参数是可选的,如果未提供,该函数将回退到默认问候语。
使用交叉类型进行灵活的类型组合
交集类型允许您将多个类型组合成一个类型,创建一个新类型,该类型具有每个组成类型的所有属性和方法。这为组合类型提供了灵活性,并且在处理复杂的对象结构时特别有用。这是一个例子:
type Greeting = {
greet(): void;
};
type Farewell = {
sayGoodbye(): void;
};
type GreetingAndFarewell = Greeting & Farewell;
class Person implements GreetingAndFarewell {
greet() {
console.log('Hello!');
}
sayGoodbye() {
console.log('Goodbye!');
}
}
const person = new Person();
person.greet(); // Hello!
person.sayGoodbye(); // Goodbye!
在此示例中,我们定义了 Greeting 和 Farewell 类型,它们表示具有特定方法的对象。通过使用交集类型运算符 ( & ),我们创建了一个结合了这两种类型的新类型 GreetingAndFarewell 。然后 Person 类实现 GreetingAndFarewell 类型,要求它提供 greet 和 sayGoodbye 方法的实现。通过使用交集类型,您可以创建灵活且可重用的类型组合来表示 TypeScript 代码中的复杂行为和结构。
总结
TypeScript 是一种强大的编程语言,可为 JavaScript 开发带来静态类型和高级功能。这些技巧将帮助您编写更清晰、更易于维护的代码并提高您的工作效率。采用 TypeScript 的强类型系统并利用其工具支持来创建健壮且可扩展的应用程序。请记住随时了解最新的 TypeScript 进展,并继续学习以在不断发展的 Web 开发世界中保持领先地位。请立即开始应用这些技巧,在您的项目中释放 TypeScript 的全部潜力。
转载自:https://juejin.cn/post/7242504297270607909