javascript - 对象不工作的 JsDoc 联合类型
问题描述
我对此束手无策。似乎它应该可以工作,我已经为此苦苦挣扎了几个小时,但我不确定出了什么问题。这是我能想到的最小的例子。我什至有一个类型后卫。
/** @typedef {{ a: string }} TypeA*/
/** @typedef {{ b: string }} TypeB*/
/** @typedef {(TypeA | TypeB) } TypeC */
/** @type {TypeC} */
let typeC;
console.log(typeC.b) // autocompletion for property b doesn't work
我得到错误:
Property 'b' does not exist on type '{ a: string; } | { b: string; }'.
Property 'b' does not exist on type '{ a: string; }'.ts(2339)
解决方案
我发现一个 jsdoc 风格的类型保护可以让我访问 TypeC 的属性,如果我能够将其键入为 TypeB。
/** @typedef {{ a: string }} TypeA*/
/** @typedef {{ b: string }} TypeB*/
/** @typedef {(TypeA | TypeB) } TypeC */
/**
* @param {*} value
* @returns {value is TypeB}
*/
function typeIsB(value) {
return true;
}
/** @type {TypeC} */
let typeC;
if (typeIsB(typeC)) {
console.log(typeC.b) // no error, autocomplete works when typing typeC.b
}
自动完成工作的屏幕截图:
推荐阅读
- pgadmin - PGAdmin - 将空日期值导入 postgres
- python - 部署一个简单的 Python 机器人
- python - 在for循环中查找索引位置
- sql-server - 如何从两个表中选择具有不同值的列?
- python - 匹配时替换字符串中的所有内容
- html - Jekyll 图片更新 - Github Chart
- typescript - Typescript,我很好奇它是否可以实现这种动态类型检查
- python - 如何在 Django 模型中将用户用作 ForeignKey
- c++ - 在功能块中使用新运算符时住在堆或堆栈上?
- node.js - 在 NodeJS + Typescript AWS Lambda 上进行单元测试