Rush Stack商店博客活动
跳至主要内容

ae-incompatible-release-tags

"符号 标记为 ,但其签名引用 标记为 ."

备注

TSDoc 的“发布标签”根据其可见性形成排序

@public > @beta > @alpha > @internal

例如,当应用 .d.ts 修剪时,“beta”发布将包含标记为 @public@beta 的声明,但会省略标记为 @alpha@internal 的声明。这可以防止开发人员意外使用 @alpha@internal 声明。

但假设我们有一个这样的 API

/**
* Not visible in a "beta" release.
* @alpha
*/
export ICalculateOptions {
numerator: number;
denominator: number;
}

/**
* Visible in a "beta" release.
* @beta
*/
export function calculate(options: ICalculateOptions): void { // <-- problem!
}

// Warning: The symbol "calculate" is marked as "@beta", but its signature references
// "ICalculateOpations" which is marked as "@alpha"

当开发人员使用“beta”发布时,他们将无法访问调用 calculate() 函数所需的 ICalculateOptions 类型。这不好!

类似地,假设 @beta 类要继承自 @alpha

/**
* Not visible in a "beta" release.
* @alpha
*/
export class Control {
public constructor(x: height, y: width) {}
}

/**
* Visible in a "beta" release.
* @beta
*/
export class Button extends Control {
// <-- problem!
}

// Warning: "The symbol "Button" is marked as "@beta", but its signature references
// "Control" which is marked as "@alpha"

当开发人员使用“beta”发布时,他们不应该使用 Control 类型,因为它被标记为 @alpha。但是,他们如何构造依赖于它的 Button 类实例?

有趣的是,考虑当标签反转时会发生什么

/**
* Visible in a "beta" release.
* @beta
*/
export class Control {
public constructor(x: height, y: width) {}
}

/**
* Not visible in a "beta" release.
* @alpha
*/
export class Button extends Control {
// <-- okay
}

在这个例子中,“beta”发布隐藏了 Button 类,但开发人员仍然可以完全使用基类 Control。所以这里没有不兼容性。

总的来说,这里的原则是类型签名不应该引用发布标签可见性较低的其他类型。API 提取器会为您检查这一点,如果检测到不一致,它会报告 ae-incompatible-release-tags

如何修复

更正发布标签,使关系一致。

另请参阅