条件语句 #

一、条件语句概述 #

条件语句用于根据条件执行不同的代码块。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