Closed
Description
π Search Terms
deferred index mapped type apparent keys
π Version & Regression Information
- This changed in PR: When relating a deferred index type over a mapped type on the source side ...Β #56742
β― Playground Link
π» Code
// @noErrorTruncation: true
type Values<T> = T[keyof T];
type IsNever<T> = [T] extends [never] ? true : false;
type Cast<A, B> = A extends B ? A : B;
type Compute<A extends any> = { [K in keyof A]: A[K] } & unknown;
type Invert<T extends Record<PropertyKey, PropertyKey>> = {
[K in keyof T as T[K]]: K;
};
interface ActorLogic<in out TSnapshot, in out TEvent extends { type: string }> {
transition: (snapshot: TSnapshot, message: TEvent) => TSnapshot;
}
type AnyActorLogic = ActorLogic<any, any>;
interface ActorRef<TSnapshot, TEvent extends { type: string }> {
send: (event: TEvent) => void;
getSnapshot: () => TSnapshot;
}
type AnyActorRef = ActorRef<any, any>;
type ActorRefFrom<T> = T extends ActorLogic<infer TSnapshot, infer TEvent>
? ActorRef<TSnapshot, TEvent>
: never;
interface ProvidedActor {
src: string;
logic: AnyActorLogic;
id?: string;
}
declare class StateMachine<
TChildren extends Record<string, AnyActorRef | undefined>,
> {
children: TChildren;
}
type ExtractLiteralString<T extends string | undefined> = T extends string
? string extends T
? never
: T
: never;
type ToConcreteChildren<TActor extends ProvidedActor> = {
[A in TActor as ExtractLiteralString<A["id"]>]?: ActorRefFrom<A["logic"]>;
};
type ToChildren<TActor extends ProvidedActor> = string extends TActor["src"]
? Record<string, AnyActorRef>
: Compute<
ToConcreteChildren<TActor> &
{
include: {
[id: string]: TActor extends any
? ActorRefFrom<TActor["logic"]> | undefined
: never;
};
exclude: {};
}[undefined extends TActor["id"]
? "include"
: string extends TActor["id"]
? "include"
: "exclude"]
>;
type ToProvidedActor<
TChildrenMap extends Record<string, string>,
TActors extends Record<Values<TChildrenMap>, AnyActorLogic>,
> = Values<{
[K in keyof TActors & string]: {
src: K;
logic: TActors[K];
id: IsNever<TChildrenMap> extends true
? string | undefined
: K extends keyof Invert<TChildrenMap>
? Invert<TChildrenMap>[K]
: string | undefined;
};
}>;
declare function setup<
TActors extends Record<Values<TChildrenMap>, AnyActorLogic>,
TChildrenMap extends Record<string, string> = never,
>({
actors,
}: {
types?: {
children?: TChildrenMap;
};
actors?: {
[K in keyof TActors]: TActors[K];
};
}): {
createMachine: () => StateMachine<
Cast<
ToChildren<ToProvidedActor<TChildrenMap, TActors>>,
Record<string, AnyActorRef | undefined>
>
>;
};
π Actual behavior
It fails to be checked
π Expected behavior
The used Cast
should be enough to satisfy the constraint
Additional information about the issue
We can get rid off the error (but lose functionality):
- if we remove
id
fromToProvidedActor
- or if we remove
Compute
fromToChildren
- or if we remove any of the intersected types within this
Compute
- or if we remove
ExtractLiteralString
filter~ fromToConcreteChildren
cc @weswigham (since it's a change from #56742 )