TypeScript中never类型的妙用

 

 本文由 ChatMoney团队出品

妙用一

 

当我们在一个项目中,可能会去改动一个在整个项目中应用很广泛的函数的参数类型,但是可能由于代码量比较庞大,我们不好排查改了之后哪些地方会出现问题,此时我们可以使用never类型来辅助我们的函数,当我们在原有的类型基础上添加了新的类型时,可能会导致else分支中的代码逻辑出现问题,此时我们可以向下面这样写来校验。

// 当类型Method只有GET和POST时
type Method = "GET" | "POST"

function request(method: Method) {
  if (method === "GET") {
    // ...
  } else if (method === "POST") {
    //...
  } else {
    // 此时的else分支是不可能执行到的,因为TypeScript会检查到所有的可能值,如果有其他值,则会报错。
    const n: never = method;
  }
}
// 当我们新增一个类型PUT时
type Method = "GET" | "POST" | "PUT"

function request(method: Method) {
    if (method === "GET") {
      // ...
    } else if (method === "POST") {
      //...
    } else {
      // 此时应该是进入到了PUT分支,所以method应该是PUT,此时把method赋值给n由于类型不符,会抛出一个编译错误
      const n: never = method;
    }
  }

TypeScript中never类型的妙用

妙用二

当我们需要对一个类型取反时,可以使用类型的三目运算和类型继承来实现,代码实现如下:

// 此类型意思为,当我们传入的value类型为string时,value的类型会定义为never,此时会抛出类型错误
function myFunction<T>(value: T extends string ? never : T): T {
  return value;
}

myFunction("hello"); // 报错:Argument of type 'string' is not assignable to parameter of type 'never'.ts(2345)
myFunction(123); // 不报错
myFunction(true); // 不报错

TypeScript中never类型的妙用

 

我们可以把此类型单独做成一个类型工具,效果一样

type BandType<T, U> = T extends U? never : T;

function myFunction<T>(value: BandType<T, string>): T {
  return value;
}

TypeScript中never类型的妙用

关于我们

本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!

ChatMoney的头像ChatMoney
Previous 2024年 6月 11日 上午11:17
Next 2024年 6月 13日 下午6:14

相关推荐

  • 简单实现Viper配置管理

    本文由 ChatMoney团队出品 简介 前面实现的一个简易suno-api。是使用cookie来获取suno-token发起请求的。当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了cookie的值,这种做法并不好,所以现在打算把cookie值改造为一个配置,通过viper来读取。 什么是viper Viper是一个用于Go语言的应用程序配…

    2024年 6月 6日
    264
  • GPT 模型原理介绍以及应用

    本文由 ChatMoney团队出品 引言 随着人工智能技术的飞速发展,自然语言处理(NLP)领域也取得了显著的进步。其中,GPT(Generative Pre-trained Transformer)模型作为OpenAI的杰出成果,以其卓越的文本生成能力和广泛的应用前景,吸引了全球范围内的关注。本文将深入解析GPT模型的原理,帮助读者更好地理解这一技术的核心…

    2024年 6月 14日
    212
  • PHP的命名空间

    本文由 ChatMoney团队出品 PHP 命名空间:模块化和避免命名冲突 在 PHP 项目中,命名空间用于对代码进行模块化和避免命名冲突,尤其在大型项目或使用第三方库时尤为重要。本文将介绍如何使用 PHP 命名空间来组织你的代码。 什么是命名空间 命名空间是通过 namespace 关键字定义的。它们提供了一种方法来封装一组相关的类、接口、函数和常量,从而…

    2024年 7月 31日
    204
  • 简单实现suno-api账号保活

    本文由 ChatMoney团队出品 简介 之前的一个简易的项目suno-api。是使用cookie来获取suno-token发起请求的,之前写的简单,并没有做cookie保活,在运行一段时间后cookie会失效,api便失效了。那现在就来实现一个简单的账号保活。 保活原理 账号保活的实现原理比较简单,其实就是每隔一段时间去获取一次token。当然有其他保活方…

    2024年 6月 5日
    250
  • PHP 7+ PHP-FPM 参数配置注意事项

    本文由 ChatMoney团队出品 在安装 PHP 7+ 并使用 PHP-FPM 作为进程管理器时,确保 PHP-FPM 的参数配置正确至关重要。不当的配置可能导致 PHP-FPM 无法启动,进而使得 Nginx 无法解析 PHP 文件并返回 404 错误。 相关命令(适用于 CentOS 7+) 启动 PHP-FPM: 查看 PHP-FPM 是否启动: P…

    2024年 7月 26日
    248

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信