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 Extractor はこれを確認し、矛盾を検出した場合はae-incompatible-release-tags
を報告します。
解決策
関係が整合するようにリリースタグを修正します。