TypeScript的unkonw类型

TypeScript 的 ⁠unknown⁠ 类型是什么?它的作用是什么?

TypeScript 的 unknown⁠ 类型用于存储那些在编写程序时类型不确定、但又需要类型检查的值。与 any⁠ 类型类似,unknown⁠ 可以接受任何类型的赋值,但不同的是,unknown⁠ 强制在对其进行操作前必须进行类型检查或类型断言(类型断言后面的文章会有解释),从而提升了类型安全性。


unknown⁠ 类型的变量在实际代码中如何使用?

可以这样声明和赋值 unknown⁠ 类型的变量:

let result: unknown;
result = 1;
result = 'hello';
result = false;
result = Symbol();
result = { name: 'John' };
result = [1, 2, 3];

但如果你直接对 unknown⁠ 类型的变量调用方法或操作符,TypeScript 编译器会报错,因为必须先进行类型断言:

let result: unknown;
result = [1,2,3];

// 直接调用 reduce() ,编译器报错:'result' is of type 'unknown'.ts(18046)
const total = result.reduce((a: number, b:number ) => a + b, 0);


如何在 unknown⁠ 类型的变量上安全地调用方法?

要在 unknown⁠ 类型的变量上调用方法,必须先进行类型断言。例如:

let result: unknown;
result = [1, 2, 3];

// 这里使用了类型断言,关键字 'as'
const total = (result as number[]).reduce((a: number, b: number) => a + b, 0);
console.log(total); //输出 6

这里通过 (result as number[])⁠ 明确告诉 TypeScript 编译器 ⁠result⁠ 是一个数字数组,这样就可以安全地调用 reduce⁠ 方法。


unknown⁠ 和 any⁠ 类型有什么区别?分别适用于哪些场景?

具体区别详见下面的表格:

特性 any unkonw
类型安全 无类型安全 强制类型安全
操作 可直接进行任何操作 必须类型断言或类型缩小后才能操作
用例 动态值但不安全 动态值且安全,需验证
类型检查 编译器不检查 编译器强制检查
常见场景 JS 迁移到 TS 处理外部数据(API、数据库等)

简而言之,any⁠ 适合快速迁移或临时跳过类型检查,而 unknown⁠ 更适合需要安全处理外部数据的场景。

如何用 unknown⁠ 类型安全地处理外部 API 数据?

当你从外部 API 获取数据时,可以用 ⁠unknown⁠ 类型接收,然后在使用前进行类型断言:

// 获取远程 API 的数据方法
const fetchData = async (url: string): Promise<unknown> => {
    const response = await fetch(url);
    return await response.json();
};

// 通过获取远程 API 的数据,来展示文章列表
const showPosts = async () => {
    const url = 'https://jsonplaceholder.typicode.com/posts';
    try {
        const posts = await fetchData(url); // unknown 类型
        (
            posts as { userId: number; id: number; title: string; body: string }[]
        ).map((post) => console.log(post.title));
    } catch (err) {
        console.log(err);
    }
};

showPosts();

这样可以确保在处理数据前先进行类型验证,提升代码的健壮性和安全性。


如何利用 unknown⁠ 类型创建类型安全的接口?

你可以通过类型判断和类型缩(后续文章会解释)小来安全地处理 unknown⁠ 类型的值:

function format(value: unknown): void {
  switch (typeof value) {
    case 'string':
      console.log('String:', value.toUpperCase());
      break;
    case 'number':
      console.log('Number:', value.toFixed(2));
      break;
    default:
      console.log('Other types:', value);
  }
}

在访问值的方法前,先判断其类型,确保操作的安全性。


什么时候应该优先使用 unknown⁠ 类型?

  • 当你需要处理来自外部的数据源(如 API、数据库等),且无法提前确定数据类型时,优先使用 unknown⁠,并在使用前进行类型验证。
  • unknown⁠ 类型比 ⁠any⁠ 更安全,能有效防止类型相关的运行时错误。

备注:

JSONPlaceholder是一个免费的在线REST API,您可以在需要一些假数据时使用。它可以用在GitHub上的README,CodeSandbox上的演示,Stack Overflow上的代码示例,...或者简单地用于本地测试。

image



  • 如果你觉得我的工作对你有帮助,可以通过分享和推荐这篇文字或者关注同名公众号来支持我,你的支持是我持续创作的最大动力:
    image

  • 转载以及引用请注明原文链接

  • 本博客所有文章除特别声明外,均采用CC 署名-非商业使用-相同方式共享 许可协议。

posted @ 2025-06-03 18:23  Asanwos  阅读(27)  评论(0)    收藏  举报