From 65a27a798af20c2f54a966fadbd5f1e4c335d20a Mon Sep 17 00:00:00 2001 From: dai Date: Tue, 12 Aug 2025 21:39:04 +0300 Subject: [PATCH] Separate undefined components and tags (#266) --- jecs.d.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/jecs.d.ts b/jecs.d.ts index 6972f36..65dfe61 100755 --- a/jecs.d.ts +++ b/jecs.d.ts @@ -7,10 +7,14 @@ export type Entity = number & { readonly __type_TData: TData; }; +type TagDiscriminator = { + readonly __nominal_Tag: unique symbol; +}; + /** * An entity with no associated data when used as a component */ -export type Tag = Entity; +export type Tag = Entity; /** * A pair of entities: @@ -26,12 +30,12 @@ export type Pair

= number & { * An `Id` can be either a single Entity or a Pair of Entities. * By providing `TData`, you can specifically require an Id that yields that type. */ -export type Id = Entity | Pair | Pair; +export type Id = Entity | Pair | Pair; export type InferComponent = E extends Entity ? D : E extends Pair - ? P extends undefined + ? P extends TagDiscriminator ? O : P : never; @@ -119,7 +123,7 @@ export class World { * @returns An entity (Tag) with no data. */ entity(): Tag; - entity(id: T): InferComponent extends undefined ? Tag : T; + entity(id: T): T; /** * Creates a new entity in the first 256 IDs, typically used for static @@ -148,7 +152,7 @@ export class World { * @param entity The target entity. * @param component The component (or tag) to add. */ - add(entity: Entity, component: undefined extends InferComponent ? C : Id): void; + add(entity: Entity, component: TagDiscriminator extends InferComponent ? C : Id): void; /** * Installs a hook on the given component.