feat(core): 启用 TypeScript 最严格的类型检查 (#199)
* feat(core): 启用 TypeScript 最严格的类型检查 * ci: 配置 Codecov 以适应类型安全改进 * fix(core): 修复 CodeQL 安全警告 * fix(core): eslint.config.mjs
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ export abstract class PassiveSystem extends EntitySystem {
|
||||
* 不进行任何处理
|
||||
* @param entities 实体数组,未被使用
|
||||
*/
|
||||
protected override process(entities: Entity[]): void {
|
||||
protected override process(_entities: Entity[]): void {
|
||||
// 被动系统不进行任何处理
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user