mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Defer distributing index over generic object types
This commit is contained in:
@@ -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]
|
||||
|
||||
+39
@@ -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))
|
||||
|
||||
};
|
||||
|
||||
+24
@@ -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]>;
|
||||
};
|
||||
|
||||
+16
@@ -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]>;
|
||||
};
|
||||
Reference in New Issue
Block a user