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类型检查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript利用正则表达式替换字符串中的内容

    JavaScript利用正则表达式替换字符串中的内容

    本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下
    2016-12-12
  • javascript解析xml实现省市县三级联动的方法

    javascript解析xml实现省市县三级联动的方法

    这篇文章主要介绍了javascript解析xml实现省市县三级联动的方法,涉及javascript针对节点的操作与XML文件解析的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • JS小游戏之极速快跑源码详解

    JS小游戏之极速快跑源码详解

    这篇文章主要介绍了JS小游戏之极速快跑源码详解,对游戏的主要流程及原理进行了较为详细的讲解,并附有完整实例源码,需要的朋友可以参考下
    2014-09-09
  • js阻止浏览器默认行为的简单实例

    js阻止浏览器默认行为的简单实例

    下面小编就为大家带来一篇js阻止浏览器默认行为的简单实例。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • firefox和IE系列的相关区别整理 以备后用

    firefox和IE系列的相关区别整理 以备后用

    firefox和IE系列的相关区别整理,整理相对来说还可以,但对于个别细节的处理不够完善。具体的可以参考脚本*之家以前发布的文章。
    2009-12-12
  • Javascript图像处理—为矩阵添加常用方法

    Javascript图像处理—为矩阵添加常用方法

    上一篇文章,我们定义了矩阵,这篇文章我们来给矩阵添加一些常用方法比如:toString方法、clone方法等,需要了解的朋友可以详细参考下
    2012-12-12
  • 微信小程序8种数据通信的方式小结

    微信小程序8种数据通信的方式小结

    这篇文章主要介绍了微信小程序8种数据通信的方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • layui 中select下拉change事件失效的解决方法

    layui 中select下拉change事件失效的解决方法

    今天小编就为大家分享一篇layui 中select下拉change事件失效的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 动态加载script文件的两种方法

    动态加载script文件的两种方法

    第一种就是利用ajax方式,第二种是,动态创建一个script标签,设置其src属性,通过把script标签插入到页面head来加载js,感兴趣的朋友可以了解下
    2013-08-08
  • 原生js实现的观察者和订阅者模式简单示例

    原生js实现的观察者和订阅者模式简单示例

    这篇文章主要介绍了原生js实现的观察者和订阅者模式,结合简单实例形式分析了js观察者和订阅者模式的相关原理与实现技巧,需要的朋友可以参考下
    2020-04-04

最新评论