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 Extractor はこれを確認し、矛盾を検出した場合はae-incompatible-release-tagsを報告します。

解決策

関係が整合するようにリリースタグを修正します。

参照