feat(core): 启用 TypeScript 最严格的类型检查 (#199)

* feat(core):  启用 TypeScript 最严格的类型检查

* ci: 配置 Codecov 以适应类型安全改进

* fix(core): 修复 CodeQL 安全警告

* fix(core): eslint.config.mjs
This commit is contained in:
YHH
2025-10-31 16:14:23 +08:00
committed by GitHub
parent 011d795361
commit c58e3411fd
56 changed files with 622 additions and 495 deletions

View File

@@ -65,7 +65,7 @@ interface EventListenerRecord {
* ```
*/
export abstract class EntitySystem<
TComponents extends readonly ComponentConstructor[] = []
_TComponents extends readonly ComponentConstructor[] = []
> implements ISystemBase, IService {
private _updateOrder: number;
private _enabled: boolean;
@@ -83,7 +83,6 @@ export abstract class EntitySystem<
*/
private _entityIdMap: Map<number, Entity> | null;
private _entityIdMapVersion: number;
private _entityIdMapSize: number;
/**
* 统一的实体缓存管理器
@@ -158,7 +157,6 @@ export abstract class EntitySystem<
this._entityIdMap = null;
this._entityIdMapVersion = -1;
this._entityIdMapSize = 0;
// 初始化logger
this.logger = createLogger(this.getLoggerName());
@@ -281,7 +279,6 @@ export abstract class EntitySystem<
// 清理实体ID映射缓存
this._entityIdMap = null;
this._entityIdMapVersion = -1;
this._entityIdMapSize = 0;
// 清理所有事件监听器
// 调用框架销毁方法
@@ -425,7 +422,7 @@ export abstract class EntitySystem<
const idSet = new Set<number>();
for (let i = 0; i < len; i = (i + 1) | 0) {
idSet.add(entities[i].id | 0);
idSet.add(entities[i]!.id | 0);
}
return idSet;
}
@@ -497,13 +494,12 @@ export abstract class EntitySystem<
const len = allEntities.length;
for (let i = 0; i < len; i = (i + 1) | 0) {
const entity = allEntities[i];
const entity = allEntities[i]!;
entityMap.set(entity.id | 0, entity);
}
this._entityIdMap = entityMap;
this._entityIdMapVersion = version;
this._entityIdMapSize = len;
return entityMap;
}
@@ -608,7 +604,7 @@ export abstract class EntitySystem<
*
* @param entities 要处理的实体列表
*/
protected process(entities: readonly Entity[]): void {
protected process(_entities: readonly Entity[]): void {
// 子类必须实现此方法
}
@@ -720,7 +716,7 @@ export abstract class EntitySystem<
*
* @param entity 被添加的实体
*/
protected onAdded(entity: Entity): void {
protected onAdded(_entity: Entity): void {
// 子类可以重写此方法
}
@@ -731,7 +727,7 @@ export abstract class EntitySystem<
*
* @param entity 被移除的实体
*/
protected onRemoved(entity: Entity): void {
protected onRemoved(_entity: Entity): void {
// 子类可以重写此方法
}
@@ -812,6 +808,7 @@ export abstract class EntitySystem<
if (listenerIndex >= 0) {
const listener = this._eventListeners[listenerIndex];
if (!listener) return;
// 从事件系统中移除
listener.eventSystem.off(eventType, listener.listenerRef);
@@ -958,7 +955,7 @@ export abstract class EntitySystem<
processor: (entity: Entity, index: number) => void
): void {
for (let i = 0; i < entities.length; i++) {
processor(entities[i], i);
processor(entities[i]!, i);
}
}
@@ -1031,7 +1028,7 @@ export abstract class EntitySystem<
predicate: (entity: Entity, index: number) => boolean
): Entity | undefined {
for (let i = 0; i < entities.length; i++) {
if (predicate(entities[i], i)) {
if (predicate(entities[i]!, i)) {
return entities[i];
}
}
@@ -1060,7 +1057,7 @@ export abstract class EntitySystem<
predicate: (entity: Entity, index: number) => boolean
): boolean {
for (let i = 0; i < entities.length; i++) {
if (predicate(entities[i], i)) {
if (predicate(entities[i]!, i)) {
return true;
}
}
@@ -1089,7 +1086,7 @@ export abstract class EntitySystem<
predicate: (entity: Entity, index: number) => boolean
): boolean {
for (let i = 0; i < entities.length; i++) {
if (!predicate(entities[i], i)) {
if (!predicate(entities[i]!, i)) {
return false;
}
}

View File

@@ -17,7 +17,7 @@ export abstract class PassiveSystem extends EntitySystem {
* 不进行任何处理
* @param entities 实体数组,未被使用
*/
protected override process(entities: Entity[]): void {
protected override process(_entities: Entity[]): void {
// 被动系统不进行任何处理
}
}

View File

@@ -17,7 +17,7 @@ export abstract class ProcessingSystem extends EntitySystem {
* 处理实体每帧调用processSystem方法进行处理
* @param entities 实体数组,未被使用
*/
protected override process(entities: Entity[]): void {
protected override process(_entities: Entity[]): void {
// 调用子类实现的processSystem方法进行实体处理
this.processSystem();
}

View File

@@ -2,8 +2,6 @@ import { Entity } from '../Entity';
import { EntitySystem } from './EntitySystem';
import { Matcher } from '../Utils/Matcher';
import { Time } from '../../Utils/Time';
import { createLogger } from '../../Utils/Logger';
import type { IComponent } from '../../Types';
import { PlatformManager } from '../../Platform/PlatformManager';
import type { IPlatformAdapter, PlatformWorker } from '../../Platform/IPlatformAdapter';
import { getSystemInstanceTypeName } from '../Decorators';
@@ -221,7 +219,7 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
enableWorker: config.enableWorker ?? true,
workerCount: validatedWorkerCount,
systemConfig: config.systemConfig,
entitiesPerWorker: config.entitiesPerWorker,
...(config.entitiesPerWorker !== undefined && { entitiesPerWorker: config.entitiesPerWorker }),
useSharedArrayBuffer: config.useSharedArrayBuffer ?? this.isSharedArrayBufferSupported(),
entityDataSize: config.entityDataSize ?? this.getDefaultEntityDataSize(),
maxEntities: config.maxEntities ?? 10000
@@ -321,10 +319,7 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
}
}
this.workerPool = new PlatformWorkerPool(
workers,
this.sharedBuffer // 传递SharedArrayBuffer给Worker池
);
this.workerPool = new PlatformWorkerPool(workers);
} catch (error) {
this.logger.error(`${this.systemName}: Worker池初始化失败`, error);
this.config.enableWorker = false;
@@ -355,7 +350,7 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
const sharedMethodStr = sharedProcessMethod.toString();
const sharedFunctionBodyMatch = sharedMethodStr.match(/\{([\s\S]*)\}/);
if (sharedFunctionBodyMatch) {
sharedProcessFunctionBody = sharedFunctionBodyMatch[1];
sharedProcessFunctionBody = sharedFunctionBodyMatch[1] ?? '';
}
}
@@ -491,7 +486,7 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
// 1. 数据提取阶段
const entityData: TEntityData[] = [];
for (let i = 0; i < entities.length; i++) {
entityData[i] = this.extractEntityData(entities[i]);
entityData[i] = this.extractEntityData(entities[i]!);
}
// 2. 分批处理
@@ -541,12 +536,12 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
if (results && typeof (results as any).then === 'function') {
(results as Promise<TEntityData[]>).then(finalResults => {
entities.forEach((entity, index) => {
this.applyResult(entity, finalResults[index]);
this.applyResult(entity, finalResults[index]!);
});
});
} else {
entities.forEach((entity, index) => {
this.applyResult(entity, (results as TEntityData[])[index]);
this.applyResult(entity, (results as TEntityData[])[index]!);
});
}
}
@@ -595,7 +590,7 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
if (!this.sharedFloatArray) return;
for (let i = 0; i < entities.length && i < this.config.maxEntities; i++) {
const entity = entities[i];
const entity = entities[i]!;
const data = this.extractEntityData(entity);
const offset = i * this.config.entityDataSize; // 使用配置的数据大小
@@ -670,7 +665,7 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
if (!this.sharedFloatArray) return;
for (let i = 0; i < entities.length && i < this.config.maxEntities; i++) {
const entity = entities[i];
const entity = entities[i]!;
const offset = i * this.config.entityDataSize; // 使用配置的数据大小
// 从SharedArrayBuffer读取数据
@@ -832,7 +827,7 @@ export abstract class WorkerEntitySystem<TEntityData = any> extends EntitySystem
return {
enabled: this.config.enableWorker,
workerCount: this.config.workerCount,
entitiesPerWorker: this.config.entitiesPerWorker,
...(this.config.entitiesPerWorker !== undefined && { entitiesPerWorker: this.config.entitiesPerWorker }),
maxSystemWorkerCount: this.getMaxSystemWorkerCount(),
isProcessing: this.isProcessing,
sharedArrayBufferSupported: this.isSharedArrayBufferSupported(),
@@ -871,31 +866,20 @@ class PlatformWorkerPool {
}> = [];
private busyWorkers = new Set<number>();
private taskCounter = 0;
private sharedBuffer: SharedArrayBuffer | null = null;
private readonly logger = createLogger('PlatformWorkerPool');
constructor(
workers: PlatformWorker[],
sharedBuffer: SharedArrayBuffer | null = null
workers: PlatformWorker[]
) {
this.sharedBuffer = sharedBuffer;
this.workers = workers;
// 为每个Worker设置消息处理器
for (let i = 0; i < workers.length; i++) {
const worker = workers[i];
if (!worker) continue;
// 设置消息处理器
worker.onMessage((event) => this.handleWorkerMessage(i, event.data));
worker.onError((error) => this.handleWorkerError(i, error));
// 如果有SharedArrayBuffer发送给Worker
if (sharedBuffer) {
worker.postMessage({
type: 'init',
sharedBuffer: sharedBuffer
});
}
}
}
@@ -946,14 +930,15 @@ class PlatformWorkerPool {
if (!this.busyWorkers.has(i) && this.taskQueue.length > 0) {
const task = this.taskQueue.shift()!;
this.busyWorkers.add(i);
const worker = this.workers[i]!;
this.workers[i].postMessage({
worker.postMessage({
id: task.id,
...task.data
});
// 存储任务信息以便后续处理
(this.workers[i] as any)._currentTask = task;
(worker as any)._currentTask = task;
}
}
}