当前位置: 首页 > 知识库问答 >
问题:

JSDoc中的类型断言函数

方增
2023-03-14

我试图提出以下类型脚本类型断言函数的JavaScript JSDoc变体:

function typeCheck<T>(value: unknown, type: new () => T) {
    if (value instanceof type) {
        return value;
    }

    throw new Error('Invalid type');
}

const maybeButton: unknown = document.createElement('button');
const button = typeCheck(maybeButton, HTMLButtonElement);

我想到了这个,但我得到了一个错误:

/** @template T */
/** @returns {T} */
export default function check(/** @type {unknown} */ object, /** @type {new () => T} */ type) {
  if (object instanceof type) {
    /** @type {any} */
    const any = object;

    /** @type {T} */
    const t = any;

    return t;
  }

  throw new Error(`Object ${object} does not have the right type '${type}'!`)
}

错误在调用站点:const按钮=检查(event.current目标,HTMLButtonElement);HTMLButtonElement下划线,错误消息如下:

Argument of type '{ new (): HTMLButtonElement; prototype: HTMLButtonElement; }' is not assignable to parameter of type 'new () => T'.
  Type 'HTMLButtonElement' is not assignable to type 'T'.
    'T' could be instantiated with an arbitrary type which could be unrelated to 'HTMLButtonElement'.ts(2345)

是否可以开发这样的JSDoc函数,当传递未知时,仅使用TypeScript类型干扰和转义分析验证并返回作为提供的类型键入的未知对象?

一般来说,我对JSDoc不感兴趣,但特别是在Visual Studio代码中使用的JSDoc,TypeScript语言服务使用JSDoc作为类型提示处理JavaScript项目。

共有2个答案

锺离明煦
2023-03-14

TS 3.7中引入的断言函数可以断言其调用范围内值的类型。

/**
 * @param {*} maybeString
 * @returns {asserts maybeString is string}
 */
function assertString(maybeString) {
  if (typeof maybeString !== 'string') throw Error('not a string');
}

/**
 * @param {unknown} something
 */
function demo(something) {
  something.concat; // type error
  assertString(something);
  something.concat; // valid
}
乜承嗣
2023-03-14

打字稿不和谐上的一个人帮我想出了答案:

/**
 * @template T
 * @returns {T}
 * @param {unknown} obj
 * @param {new () => T} type
 */
export default function assertInstance(obj, type) {
  if (obj instanceof type) {
    /** @type {any} */
    const any = obj;

    /** @type {T} */
    const t = any;

    return t;
  }

  throw new Error(`Object ${obj} does not have the right type '${type}'!`)
}
 类似资料:
  • 7.10. 类型断言 类型断言是一个使用在接口值上的操作。语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。 这里有两种可能。第一种,如果断言的类型T是一个具体类型,然后类型断言检查x的动态类型是否和T相同。如果这个检查成功了,类型断言的结果是x的动态值,当然它的类型是T。换句话说,具体类型的类型断言从它的

  • 问题内容: 我已经创建了一个基于字符串的角色类型,现在我想通过实现Valuer和Scanner接口使其与数据库驱动程序一起使用 我不断收到错误: 我在这里做错了什么? 问题答案: 这是第一个功能的工作代码: 尽管您可能希望使用并返回一个错误来代替恐慌。 a的签名不是您给的,而是: 请注意,这不会处理或产生NULL值。

  • 本节介绍类型断言,有使用关键字 as 和标签 <> 两种方式,因后者会与JSX 语法冲突,建议统一使用 as 来进行类型断言。 1. 慕课解释 TypeScript 允许你覆盖它的推断,毕竟作为开发者你比编译器更了解你写的代码。 类型断言主要用于当 TypeScript 推断出来类型并不满足你的需求,你需要手动指定一个类型。 2. 关键字 as 当你把 JavaScript 代码迁移到 TypeS

  • 类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。 在Go语言中类型断言的语法格式如下: value, ok := x.(T) 其中,x 表示一个接口的类型,T 表示一个具体的类型(也可为接口类型)。 该断言表达式会返回 x 的值(也就是 value)和一个布尔值(也就是 ok),可根据该布尔值判断 x 是否为 T

  • 编辑:OK,在typescript规范中有详细说明:类型断言

  • 问题内容: 我正在阅读《 Go编程语言》中的类型断言,但不理解它们。 我了解有不同的方案: T是具体类型或接口 可以返回一个(确定值?)或两个(确定)值 这是我不明白的: 我为什么要使用它们? 他们到底返回什么? 我也用谷歌搜索这个话题,但仍然不明白。 问题答案: 一行: 断言这不是nil并且存储的值是type 。 我为什么要使用它们: 检查为零 检查它是否可转换(断言)为另一种类型 转换(断言)