Skip to content

Commit

Permalink
Defer distributing index over generic object types
Browse files Browse the repository at this point in the history
  • Loading branch information
Andarist committed Aug 30, 2022
1 parent 8b482b5 commit 00e3926
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15903,6 +15903,9 @@ namespace ts {
}

function distributeIndexOverObjectType(objectType: Type, indexType: Type, writing: boolean) {
if (shouldDeferIndexType(objectType)) {
return;
}
// (T | U)[K] -> T[K] | U[K] (reading)
// (T | U)[K] -> T[K] & U[K] (writing)
// (T & U)[K] -> T[K] & U[K]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
=== tests/cases/compiler/mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts ===
interface StateSchema {
>StateSchema : Symbol(StateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 0, 0))

states?: {
>states : Symbol(StateSchema.states, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 0, 23))

[key: string]: StateSchema;
>key : Symbol(key, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 2, 5))
>StateSchema : Symbol(StateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 0, 0))

};
}

declare class StateNode<TStateSchema extends StateSchema> {
>StateNode : Symbol(StateNode, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 4, 1))
>TStateSchema : Symbol(TStateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 6, 24))
>StateSchema : Symbol(StateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 0, 0))

schema: TStateSchema;
>schema : Symbol(StateNode.schema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 6, 59))
>TStateSchema : Symbol(TStateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 6, 24))
}

type StateNodesConfig<TStateSchema extends StateSchema> = {
>StateNodesConfig : Symbol(StateNodesConfig, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 8, 1))
>TStateSchema : Symbol(TStateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 10, 22))
>StateSchema : Symbol(StateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 0, 0))

[K in keyof TStateSchema["states"]]: StateNode<NonNullable<TStateSchema["states"]>[K]>;
>K : Symbol(K, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 11, 3))
>TStateSchema : Symbol(TStateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 10, 22))
>StateNode : Symbol(StateNode, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 4, 1))
>NonNullable : Symbol(NonNullable, Decl(lib.es5.d.ts, --, --))
>TStateSchema : Symbol(TStateSchema, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 10, 22))
>K : Symbol(K, Decl(mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts, 11, 3))

};

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
=== tests/cases/compiler/mappedTypeOverNullableConstraintWithIndexSignatureWithNonNullable.ts ===
interface StateSchema {
states?: {
>states : { [key: string]: StateSchema; } | undefined

[key: string]: StateSchema;
>key : string

};
}

declare class StateNode<TStateSchema extends StateSchema> {
>StateNode : StateNode<TStateSchema>

schema: TStateSchema;
>schema : TStateSchema
}

type StateNodesConfig<TStateSchema extends StateSchema> = {
>StateNodesConfig : StateNodesConfig<TStateSchema>

[K in keyof TStateSchema["states"]]: StateNode<NonNullable<TStateSchema["states"]>[K]>;
};

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// @noEmit: true
// @strict: true

interface StateSchema {
states?: {
[key: string]: StateSchema;
};
}

declare class StateNode<TStateSchema extends StateSchema> {
schema: TStateSchema;
}

type StateNodesConfig<TStateSchema extends StateSchema> = {
[K in keyof TStateSchema["states"]]: StateNode<NonNullable<TStateSchema["states"]>[K]>;
};

0 comments on commit 00e3926

Please sign in to comment.