对象不工作的 JsDoc 联合类型
JsDoc union type with objects not working
我对此束手无策。看起来它应该可以工作,我已经努力了几个小时,但我不确定出了什么问题。这是我能想到的最小的例子。我什至有类型保护。
/** @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)
我认为您正在寻找 A 和 B 的 intersection,而不是联合。这是解决您的问题的打字稿代码:
interface A {
a: string;
}
interface B {
b: string;
}
type C = A & B;
我发现 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
}
自动完成工作的屏幕截图:
当你说一个值是类型 A 或 B 时,打字稿编译器不知道该变量引用了哪种类型的值。
/** @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
您需要一个条件来确定 typeC 引用的值的实际类型。例如:
if ('a' in typeC) {
console.log(typeC.a) // autocompletion for property a works
} else {
console.log(typeC.b) // autocompletion for property b works
}
我对此束手无策。看起来它应该可以工作,我已经努力了几个小时,但我不确定出了什么问题。这是我能想到的最小的例子。我什至有类型保护。
/** @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)
我认为您正在寻找 A 和 B 的 intersection,而不是联合。这是解决您的问题的打字稿代码:
interface A {
a: string;
}
interface B {
b: string;
}
type C = A & B;
我发现 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
}
自动完成工作的屏幕截图:
当你说一个值是类型 A 或 B 时,打字稿编译器不知道该变量引用了哪种类型的值。
/** @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
您需要一个条件来确定 typeC 引用的值的实际类型。例如:
if ('a' in typeC) {
console.log(typeC.a) // autocompletion for property a works
} else {
console.log(typeC.b) // autocompletion for property b works
}