Typescript中Type check类型检查的实现

 更新时间:2025年10月10日 09:26:58   作者:心随雨下  
本文主要介绍了Typescript中Type check类型检查的实现,类型检查是一项非常重要的特性,它可以帮助你捕获潜在的错误,下面就来详细的介绍一下如何实现,感兴趣的可以了解一下

TypeScript 的类型检查是其核心特性之一,它提供了强大的静态类型系统。

1. 基础类型检查

基本类型注解

// 基本类型
let name: string = "John";
let age: number = 30;
let isActive: boolean = true;
let nothing: null = null;
let undef: undefined = undefined;

// 数组
let numbers: number[] = [1, 2, 3];
let names: Array<string> = ["Alice", "Bob"];

// 元组
let tuple: [string, number] = ["hello", 42];

2. 对象类型检查

接口(Interface)

interface User {
  id: number;
  name: string;
  email?: string; // 可选属性
  readonly createdAt: Date; // 只读属性
}

const user: User = {
  id: 1,
  name: "John",
  createdAt: new Date()
};

// 错误:缺少必需的属性
// const invalidUser: User = { id: 1 }; // Error: Property 'name' is missing

// 错误:修改只读属性
// user.createdAt = new Date(); // Error: Cannot assign to 'createdAt'

类型别名(Type Alias)

type Point = {
  x: number;
  y: number;
};

type ID = number | string;

3. 函数类型检查

// 函数声明
function add(a: number, b: number): number {
  return a + b;
}

// 函数表达式
const multiply: (x: number, y: number) => number = function(x, y) {
  return x * y;
};

// 箭头函数
const divide = (a: number, b: number): number => a / b;

// 可选参数和默认参数
function greet(name: string, greeting: string = "Hello"): string {
  return `${greeting}, ${name}!`;
}

// 剩余参数
function sum(...numbers: number[]): number {
  return numbers.reduce((acc, curr) => acc + curr, 0);
}

4. 联合类型和交叉类型

// 联合类型
type Status = "pending" | "success" | "error";
let currentStatus: Status = "pending";

type StringOrNumber = string | number;
let value: StringOrNumber = "hello";
value = 42;

// 交叉类型
interface Named {
  name: string;
}

interface Aged {
  age: number;
}

type Person = Named & Aged;
const person: Person = { name: "John", age: 30 };

5. 泛型类型检查

// 泛型函数
function identity<T>(arg: T): T {
  return arg;
}

// 泛型接口
interface Response<T> {
  data: T;
  status: number;
}

const userResponse: Response<User> = {
  data: { id: 1, name: "John", createdAt: new Date() },
  status: 200
};

// 泛型约束
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length);
}

6. 高级类型检查

类型守卫(Type Guards)

function isString(value: any): value is string {
  return typeof value === "string";
}

function processValue(value: string | number) {
  if (isString(value)) {
    // TypeScript 知道这里 value 是 string 类型
    console.log(value.toUpperCase());
  } else {
    // TypeScript 知道这里 value 是 number 类型
    console.log(value.toFixed(2));
  }
}

keyof 和 typeof

interface User {
  id: number;
  name: string;
  email: string;
}

type UserKeys = keyof User; // "id" | "name" | "email"

const user = { name: "John", age: 30 };
type UserType = typeof user; // { name: string; age: number; }

7. 严格的类型检查选项

在 tsconfig.json 中启用严格模式:

{
  "compilerOptions": {
    "strict": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "exactOptionalPropertyTypes": true,
    "noImplicitOverride": true
  }
}

具体严格选项:

  • strict: 启用所有严格类型检查选项
  • noImplicitAny: 禁止隐含的 any 类型
  • strictNullChecks: 严格的 null 检查
  • strictFunctionTypes: 严格的函数类型检查
  • strictPropertyInitialization: 严格的属性初始化检查

8. 类型推断

TypeScript 在很多情况下可以自动推断类型:

// 类型推断
let message = "hello"; // 推断为 string 类型
let count = 42; // 推断为 number 类型

// 函数返回类型推断
function createUser(name: string, age: number) {
  return { name, age }; // 推断返回类型为 { name: string; age: number }
}

// 上下文类型推断
const buttons = document.querySelectorAll("button");
buttons.forEach(button => {
  button.addEventListener("click", e => {
    // e 被推断为 MouseEvent
    console.log(e.target);
  });
});

9. 类型兼容性

TypeScript 使用结构化类型系统:

interface Point {
  x: number;
  y: number;
}

interface NamedPoint {
  x: number;
  y: number;
  name: string;
}

let point: Point = { x: 1, y: 2 };
let namedPoint: NamedPoint = { x: 1, y: 2, name: "origin" };

point = namedPoint; // OK: NamedPoint 包含 Point 的所有属性
// namedPoint = point; // Error: Point 缺少 name 属性

10. 实用类型(Utility Types)

interface User {
  id: number;
  name: string;
  email: string;
  age: number;
}

// Partial: 所有属性变为可选
type PartialUser = Partial<User>;

// Readonly: 所有属性变为只读
type ReadonlyUser = Readonly<User>;

// Pick: 选择部分属性
type UserBasicInfo = Pick<User, "id" | "name">;

// Omit: 排除部分属性
type UserWithoutEmail = Omit<User, "email">;

// Record: 创建键值对类型
type UserMap = Record<string, User>;

TypeScript 的类型检查系统非常强大,能够在编译时捕获许多常见的错误,提供更好的开发体验和代码质量。

到此这篇关于Typescript中Type check类型检查的实现的文章就介绍到这了,更多相关Typescript Type check类型检查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js实现验证码干扰(动态)

    js实现验证码干扰(动态)

    这篇文章主要为大家详细介绍了js实现验证码干扰,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • JS中数组常用的循环遍历你会几种

    JS中数组常用的循环遍历你会几种

    JS 遍历数组(循环数组)的方式有多种,但你都知道吗?下面这篇文章主要给大家介绍了关于JS中数组常用循环遍历的相关资料,需要的朋友可以参考下
    2021-06-06
  • 浅析js中base64与file的转换

    浅析js中base64与file的转换

    这篇文章主要为大家详细介绍了JavaScript中base64与file的转换的实现方法,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • javascript ES6 Template String模板字符串使用方法

    javascript ES6 Template String模板字符串使用方法

    这篇文章主要介绍了javascript ES6 模板字符串(Template String)是增强版的字符串,用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量,需要的朋友可以参考下
    2023-06-06
  • css值转换成数值请抛弃parseInt

    css值转换成数值请抛弃parseInt

    绝大多数人喜欢用parseInt()把css中的字符串值转换成数值
    2011-10-10
  • javascript 终止函数执行操作

    javascript 终止函数执行操作

    本篇文章主要是对javascript 终止函数执行的操作方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • uni-app实现获取验证码倒计时功能

    uni-app实现获取验证码倒计时功能

    这篇文章主要为大家详细介绍了uni-app实现获取验证码倒计时功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • JavaScript阻止事件冒泡和默认行为的方法举例

    JavaScript阻止事件冒泡和默认行为的方法举例

    JavaScript事件的默认行为指浏览器自动执行的操作,如链接跳转或表单提交,阻止这些行为可以使用event.preventDefault()、return false或event.returnValue属性,event.stopPropagation()用于阻止事件传播,不直接阻止默认行为,需要的朋友可以参考下
    2024-10-10
  • JavaScript实现省市区三级联动

    JavaScript实现省市区三级联动

    这篇文章主要为大家详细介绍了JavaScript实现省市区三级联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • JavaScript小技巧整理篇(非常全)

    JavaScript小技巧整理篇(非常全)

    这篇文章主要介绍了JavaScript小技巧整理篇(非常全)的相关资料,需要的朋友可以参考下
    2016-01-01

最新评论