[Misc] Disallow using NonFunctionProperties in loadTag methods (#6185)

Disallow using NonFunctionProperties in loadTag methods
This commit is contained in:
Sirz Benjie 2025-07-31 19:08:41 -06:00 committed by GitHub
parent 4dd6eb4e95
commit 8ef2fadce4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 7 additions and 12 deletions

View File

@ -71,13 +71,10 @@ import i18next from "i18next";
* // Then we must also define a loadTag method with one of the following signatures
* public override loadTag(source: BaseArenaTag & Pick<ExampleTag, "tagType" | "a" | "b"): void;
* public override loadTag<const T extends this>(source: BaseArenaTag & Pick<T, "tagType" | "a" | "b">): void;
* public override loadTag(source: NonFunctionProperties<ExampleTag>): void;
* }
* ```
* Notes
* - If the class has any subclasses, then the second form of `loadTag` *must* be used.
* - The third form *must not* be used if the class has any getters, as typescript would expect such fields to be
* present in `source`.
*/
/** Interface containing the serializable fields of ArenaTagData. */

View File

@ -44,7 +44,7 @@ import type {
SemiInvulnerableTagType,
TrappingBattlerTagType,
} from "#types/battler-tags";
import type { Mutable, NonFunctionProperties } from "#types/type-helpers";
import type { Mutable } from "#types/type-helpers";
import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common";
/**
@ -80,13 +80,10 @@ import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder
* // Then we must also define a loadTag method with one of the following signatures
* public override loadTag(source: BaseBattlerTag & Pick<ExampleTag, "tagType" | "a" | "b"): void;
* public override loadTag<const T extends this>(source: BaseBattlerTag & Pick<T, "tagType" | "a" | "b">): void;
* public override loadTag(source: NonFunctionProperties<ExampleTag>): void;
* }
* ```
* Notes
* - If the class has any subclasses, then the second form of `loadTag` *must* be used.
* - The third form *must not* be used if the class has any getters, as typescript would expect such fields to be
* present in `source`.
*/
/** Interface containing the serializable fields of BattlerTag */
@ -419,7 +416,6 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag {
public override readonly tagType = BattlerTagType.GORILLA_TACTICS;
/** ID of the move that the user is locked into using*/
public readonly moveId: MoveId = MoveId.NONE;
constructor() {
super(BattlerTagType.GORILLA_TACTICS, BattlerTagLapseType.CUSTOM, 0);
}
@ -1235,7 +1231,7 @@ export class EncoreTag extends MoveRestrictionBattlerTag {
);
}
public override loadTag(source: NonFunctionProperties<EncoreTag>): void {
public override loadTag(source: BaseBattlerTag & Pick<EncoreTag, "tagType" | "moveId">): void {
super.loadTag(source);
this.moveId = source.moveId;
}
@ -2618,7 +2614,7 @@ export class CommandedTag extends SerializableBattlerTag {
}
}
override loadTag(source: NonFunctionProperties<CommandedTag>): void {
override loadTag(source: BaseBattlerTag & Pick<CommandedTag, "tagType" | "tatsugiriFormKey">): void {
super.loadTag(source);
(this as Mutable<this>).tatsugiriFormKey = source.tatsugiriFormKey;
}
@ -2659,7 +2655,9 @@ export class StockpilingTag extends SerializableBattlerTag {
}
};
public override loadTag(source: NonFunctionProperties<StockpilingTag>): void {
public override loadTag(
source: BaseBattlerTag & Pick<StockpilingTag, "tagType" | "stockpiledCount" | "statChangeCounts">,
): void {
super.loadTag(source);
this.stockpiledCount = source.stockpiledCount || 0;
this.statChangeCounts = {
@ -3006,7 +3004,7 @@ export class AutotomizedTag extends SerializableBattlerTag {
this.onAdd(pokemon);
}
public override loadTag(source: NonFunctionProperties<AutotomizedTag>): void {
public override loadTag(source: BaseBattlerTag & Pick<AutotomizedTag, "tagType" | "autotomizeCount">): void {
super.loadTag(source);
this.autotomizeCount = source.autotomizeCount;
}