条件语句 #
一、条件语句概述 #
条件语句用于根据条件执行不同的代码块。Deno支持if语句和条件(三元)运算符。
二、if语句 #
2.1 基本语法 #
typescript
const age = 18;
if (age >= 18) {
console.log("成年人");
}
2.2 语句块 #
当只有一条语句时,花括号可以省略(但不推荐):
typescript
// 不推荐
if (age >= 18) console.log("成年人");
// 推荐
if (age >= 18) {
console.log("成年人");
}
2.3 多条语句 #
typescript
const score = 85;
if (score >= 60) {
console.log("及格");
console.log("恭喜!");
}
三、if-else语句 #
3.1 基本语法 #
typescript
const age = 16;
if (age >= 18) {
console.log("成年人");
} else {
console.log("未成年人");
}
3.2 嵌套if-else #
typescript
const score = 75;
if (score >= 90) {
console.log("优秀");
} else {
if (score >= 60) {
console.log("及格");
} else {
console.log("不及格");
}
}
四、if-else if-else语句 #
4.1 基本语法 #
typescript
const score = 85;
if (score >= 90) {
console.log("优秀");
} else if (score >= 80) {
console.log("良好");
} else if (score >= 60) {
console.log("及格");
} else {
console.log("不及格");
}
4.2 多条件判断 #
typescript
const hour = new Date().getHours();
if (hour < 6) {
console.log("凌晨");
} else if (hour < 12) {
console.log("上午");
} else if (hour < 18) {
console.log("下午");
} else {
console.log("晚上");
}
五、条件运算符(三元运算符) #
5.1 基本语法 #
typescript
const age = 20;
const status = age >= 18 ? "成年人" : "未成年人";
console.log(status); // 成年人
5.2 嵌套三元运算符 #
typescript
const score = 85;
const grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 60 ? "C" : "D";
console.log(grade); // B
5.3 实际应用 #
typescript
// 默认值
function greet(name: string) {
const displayName = name ? name : "Guest";
console.log(`Hello, ${displayName}!`);
}
// 或使用空值合并
function greet2(name: string | null | undefined) {
const displayName = name ?? "Guest";
console.log(`Hello, ${displayName}!`);
}
// 条件渲染
interface User {
name: string;
isAdmin: boolean;
}
function renderHeader(user: User | null) {
return user ? `Welcome, ${user.name}` : "Please login";
}
六、逻辑运算符组合 #
6.1 与运算(&&) #
typescript
const age = 25;
const hasLicense = true;
if (age >= 18 && hasLicense) {
console.log("可以驾驶");
}
6.2 或运算(||) #
typescript
const role = "admin";
if (role === "admin" || role === "moderator") {
console.log("有管理权限");
}
6.3 非运算(!) #
typescript
const isLoggedIn = false;
if (!isLoggedIn) {
console.log("请先登录");
}
6.4 复杂组合 #
typescript
const age = 25;
const hasLicense = true;
const hasInsurance = true;
if ((age >= 18 && hasLicense) || hasInsurance) {
console.log("满足条件");
}
七、类型守卫 #
7.1 typeof类型守卫 #
typescript
function process(value: string | number) {
if (typeof value === "string") {
console.log(value.toUpperCase());
} else {
console.log(value.toFixed(2));
}
}
process("hello"); // HELLO
process(3.14159); // 3.14
7.2 instanceof类型守卫 #
typescript
class Dog {
bark() { console.log("Woof!"); }
}
class Cat {
meow() { console.log("Meow!"); }
}
function makeSound(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark();
} else {
animal.meow();
}
}
7.3 in操作符 #
typescript
interface Bird {
fly(): void;
}
interface Fish {
swim(): void;
}
function move(animal: Bird | Fish) {
if ("fly" in animal) {
animal.fly();
} else {
animal.swim();
}
}
7.4 自定义类型守卫 #
typescript
interface Success {
success: true;
data: string;
}
interface Error {
success: false;
error: string;
}
function isSuccess(result: Success | Error): result is Success {
return result.success === true;
}
function handle(result: Success | Error) {
if (isSuccess(result)) {
console.log(result.data);
} else {
console.log(result.error);
}
}
八、最佳实践 #
8.1 提前返回 #
typescript
// 不推荐:嵌套太深
function processUser(user: { name: string; age: number } | null) {
if (user) {
if (user.age >= 18) {
console.log(`${user.name} is an adult`);
} else {
console.log(`${user.name} is a minor`);
}
}
}
// 推荐:提前返回
function processUserBetter(user: { name: string; age: number } | null) {
if (!user) {
return;
}
if (user.age >= 18) {
console.log(`${user.name} is an adult`);
} else {
console.log(`${user.name} is a minor`);
}
}
8.2 使用switch替代多重if #
typescript
// 多重if-else if
function getDayName(day: number): string {
if (day === 1) return "Monday";
else if (day === 2) return "Tuesday";
else if (day === 3) return "Wednesday";
else if (day === 4) return "Thursday";
else if (day === 5) return "Friday";
else if (day === 6) return "Saturday";
else if (day === 7) return "Sunday";
else return "Invalid";
}
// 使用switch更清晰
function getDayNameSwitch(day: number): string {
switch (day) {
case 1: return "Monday";
case 2: return "Tuesday";
case 3: return "Wednesday";
case 4: return "Thursday";
case 5: return "Friday";
case 6: return "Saturday";
case 7: return "Sunday";
default: return "Invalid";
}
}
8.3 避免冗余比较 #
typescript
// 不推荐
const isValid = true;
if (isValid === true) {
console.log("Valid");
}
// 推荐
if (isValid) {
console.log("Valid");
}
// 检查布尔值
const flag: boolean | undefined = undefined;
if (flag === true) {
console.log("明确为true");
}
if (flag === false) {
console.log("明确为false");
}
if (!flag) {
console.log("false或undefined");
}
8.4 使用对象映射 #
typescript
// 多重if-else
function getColor(status: string): string {
if (status === "success") return "green";
else if (status === "warning") return "yellow";
else if (status === "error") return "red";
else return "gray";
}
// 对象映射
const colorMap: Record<string, string> = {
success: "green",
warning: "yellow",
error: "red"
};
function getColorMap(status: string): string {
return colorMap[status] ?? "gray";
}
九、实际应用 #
9.1 表单验证 #
typescript
interface FormData {
username: string;
email: string;
password: string;
age: number;
}
interface ValidationResult {
valid: boolean;
errors: string[];
}
function validateForm(data: FormData): ValidationResult {
const errors: string[] = [];
if (!data.username || data.username.length < 3) {
errors.push("用户名至少3个字符");
}
if (!data.email || !data.email.includes("@")) {
errors.push("邮箱格式不正确");
}
if (!data.password || data.password.length < 8) {
errors.push("密码至少8个字符");
}
if (data.age < 18) {
errors.push("年龄必须大于18岁");
}
return {
valid: errors.length === 0,
errors
};
}
9.2 权限检查 #
typescript
type Role = "admin" | "editor" | "viewer";
const permissions: Record<Role, string[]> = {
admin: ["read", "write", "delete", "manage"],
editor: ["read", "write"],
viewer: ["read"]
};
function hasPermission(role: Role, action: string): boolean {
return permissions[role]?.includes(action) ?? false;
}
function checkAccess(user: { role: Role }, action: string): void {
if (hasPermission(user.role, action)) {
console.log(`允许执行: ${action}`);
} else {
console.log(`权限不足: ${action}`);
}
}
9.3 API响应处理 #
typescript
interface APIResponse<T> {
status: number;
data?: T;
error?: string;
}
function handleResponse<T>(response: APIResponse<T>): T {
if (response.status >= 200 && response.status < 300) {
if (response.data) {
return response.data;
}
throw new Error("响应数据为空");
}
if (response.status >= 400 && response.status < 500) {
throw new Error(`客户端错误: ${response.error}`);
}
if (response.status >= 500) {
throw new Error(`服务器错误: ${response.error}`);
}
throw new Error("未知状态码");
}
十、总结 #
本章学习了:
- if语句的基本用法
- if-else和if-else if-else语句
- 条件(三元)运算符
- 逻辑运算符组合条件
- 类型守卫
- 最佳实践
下一章,我们将学习switch语句。
最后更新:2026-03-28