gpt4 book ai didi

javascript - JSDoc 中的类型断言函数

转载 作者:行者123 更新时间:2023-12-01 23:29:03 31 4
gpt4 key购买 nike

我正在尝试提出以下 TypeScript 类型断言函数的 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 button = check(event.currentTarget, 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 函数,当传递一个 unknown 时,将仅使用 TypeScript 类型干扰和逃逸分析来验证并返回类型为所提供类型的未知对象?

我一般对 JSDoc 不感兴趣,但特别是在 Visual Studio Code 中使用的 JSDoc 和 TypeScript 语言服务在使用 JSDoc 进行类型提示的 JavaScript 项目上工作。

最佳答案

TypeScript Discord 上的某个人帮我找到了答案:

/**
* @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}'!`)
}

关于javascript - JSDoc 中的类型断言函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66677741/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com