【问题标题】:TypeScript assert functionTypeScript 断言函数
【发布时间】:2021-02-09 20:28:32
【问题描述】:

我想用 TypeScript 创建一个断言函数,它会告诉我一个元素是否是一个实例,例如,一个 HTMLElement。

我正在尝试这样构建它:

function assertIntanceOf(
  element: unknown,
  prototype: ??? // which type should I place here?
): boolean {
  return element instanceof prototype;
}

它必须像这样工作:

const elem = document.querySelector('.someClass'); // returns an elem
assertInstanceOf(elem, HTMLElement); // returns true

const elem2 = document.querySelector('.someClassWhichNotExists'); // returns null cause elem with class .someClassWhichNotExists doesn't exist
assertInstanceOf(elem, HTMLElement); // returns false


const someVar = 123; // simply a number
assertInstanceOf(someVar, HTMLElement); //returns false

const someObj = { //just an object
 a: 'abc'
} 
assertInstanceOf(someVar, HTMLElement); //returns false

我应该为prototype 参数放置哪种类型?

【问题讨论】:

  • 为什么不直接使用typeof 运算符?
  • @VLAZ typeof elem 在这种情况下将简单地返回一个对象。它与 TypeScript 并不真正兼容
  • 抱歉,我指的是instanceof 运算符。我不知道为什么我说typeof
  • 那为什么不直接instanceof呢?在我看来,您正在尝试重写instanceof?就此而言,您的所有自定义函数都是return a instanceof b
  • @VLAZ 我可以使用typeof,但正如我所问的,我对这里的论点类型感兴趣。我想实践一下这个案例,了解如何正确创建函数

标签: typescript


【解决方案1】:

我会根据the FAQ 使用new()“构造签名”来创建generic,并返回type predicate,这样使用它实际上会缩小第一个参数的类型:

function assertInstanceOf<T>(
  element: unknown,
  prototype: { new(): T },
): element is T {
  // ...
}

Playground

也就是说,TypeScript 已经知道instanceof type guards,所以你不一定需要把它放在一个函数中。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 2019-08-21
    • 2020-01-02
    • 2012-06-03
    • 2021-12-29
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多