TypeScript 杂记十 《断言函数》

Posted 左手121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeScript 杂记十 《断言函数》相关的知识,希望对你有一定的参考价值。

TypeScript 杂记十 《断言函数》

有一类特定的函数,在非预期结果出现时会抛出一个错误。这类函数就叫做断言函数。从 v3.7 开始,TypeScript 添加了一个名为 asserts 的新关键字,它能够使编译器从断言起就知道正确的类型。

  • 断言函数的几种形式:
    • asserts 关键字,函数返回值是 void
    • is 关键字,函数返回值是 boolean
function assert(input: any): asserts input 
function assert(input: any): input is string 
  return true

// 两个都使用
function assert(input: any): asserts input is string 
  • 我们先看一个示例:
function toUpperCase(input: unknown) 
  if (typeof input !== 'string') 
    throw new Error('input 参数必须是字符串类型')
  
  // TS 自动推断出 input 是 string
  return input.toUpperCase()

  • asserts 关键字
    • 如下:参数进行断言签名,此时 input 会被 TS 认定为 string
    • 这时候只是 TS 类型推断不会报错了,但是实际运行还是会报错,所以我们需要处理一下错误时候的情况
    • 没有返回值,也不需要返回值
function assertIsString(condition: unknown): asserts condition 
  // 处理错误情况
  if (!condition) 
    throw new Error('input 参数必须是字符串类型')
  


function toUpperCase(input: unknown) 
  assertIsString(typeof input === 'string')
  // TS 自动推断出 input 是 string
  return input.toUpperCase()

  • is 关键字
    • 谓词签名-强转参数,让使用其函数的函数可以正确判断类型
    • 需要返回一个 boolean
    • 如下:在 assertIsString 返回为真的情况下,input 被转成了字符串
    • 注意:
      • 无论你是返回 true 还是返回 false,TS 都是认为 true 的时候 input 是 string
      • 这个返回的 true,false 是为了让代码在运行阶段能够正确运行,所以你必须是判断是 string 时候返回 true
function assertIsString(input: unknown): input is string 
  return typeof input === 'string'


function toUpperCase(input: unknown) 
  if (assertIsString(input)) 
    // TS 自动推断出 input 是 string
    return input.toUpperCase()
  
  return input

  • asserts A is B
    • is 是让强制转换
    • asserts 是让使用函数之后的代码都认为是某一个类型
    • 不需要返回值
function assertIsString(condition: unknown): asserts condition 
// 之后的 input 是 string
assertIsString(typeof input === 'string')

function assertIsString2(condition: unknown): asserts condition is number 
// 这个时候因为使用了 is 进行强制转换所以后续的类型都是 number
assertIsString2(typeof input === 'string')

断言签名非常强大的。我们可以用它们实现一些非常复杂的想法和设计。来对我们的程序进行类型验证。

以上是关于TypeScript 杂记十 《断言函数》的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 杂记十 《断言函数》

进阶学习13:TypeScript——安装使用特性详解

TypeScript 杂记十二 《Multiply》

TypeScript 杂记十二 《Multiply》

TypeScript 杂记十二 《Multiply》

TypeScript 杂记十一 《Assert Array Index》