diff --git a/tests/baselines/reference/reverseMappedPartiallyInferableTypes.errors.txt b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.errors.txt new file mode 100644 index 0000000000000..63ea9a9f2797f --- /dev/null +++ b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.errors.txt @@ -0,0 +1,101 @@ +tests/cases/compiler/reverseMappedPartiallyInferableTypes.ts(91,20): error TS2571: Object is of type 'unknown'. + + +==== tests/cases/compiler/reverseMappedPartiallyInferableTypes.ts (1 errors) ==== + // Repro from #30505 + + export type Prop = { (): T } + export type PropType = Prop; + export type PropDefaultValue = T; + + + export type PropValidatorFunction = (value: T) => boolean; + export type PropValidator = PropOptions; + + + export type PropOptions = { + type: PropType; + + value?: PropDefaultValue, + required?: boolean; + validator?: PropValidatorFunction; + } + + export type RecordPropsDefinition = { + [K in keyof T]: PropValidator + } + export type PropsDefinition = RecordPropsDefinition; + + + declare function extend({ props }: { props: PropsDefinition }): PropsDefinition; + + interface MyType { + valid: boolean; + } + + const r = extend({ + props: { + notResolved: { + type: Object as PropType, + validator: x => { + return x.valid; + } + }, + explicit: { + type: Object as PropType, + validator: (x: MyType) => { + return x.valid; + } + } + } + }) + + r.explicit + r.notResolved + r.explicit.required + r.notResolved.required + + // Modified repro from #30505 + + type Box = { + contents?: T; + contains?(content: T): boolean; + }; + + type Mapped = { + [K in keyof T]: Box; + } + + declare function id(arg: Mapped): Mapped; + + // All properties have inferable types + + const obj1 = id({ + foo: { + contents: "" + } + }); + + // Some properties have inferable types + + const obj2 = id({ + foo: { + contents: "", + contains(k) { + return k.length > 0; + } + } + }); + + // No properties have inferable types + + const obj3 = id({ + foo: { + contains(k) { + return k.length > 0; + ~ +!!! error TS2571: Object is of type 'unknown'. + } + } + }); + \ No newline at end of file diff --git a/tests/baselines/reference/reverseMappedPartiallyInferableTypes.js b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.js new file mode 100644 index 0000000000000..e5a9c2a57ae46 --- /dev/null +++ b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.js @@ -0,0 +1,144 @@ +//// [reverseMappedPartiallyInferableTypes.ts] +// Repro from #30505 + +export type Prop = { (): T } +export type PropType = Prop; +export type PropDefaultValue = T; + + +export type PropValidatorFunction = (value: T) => boolean; +export type PropValidator = PropOptions; + + +export type PropOptions = { + type: PropType; + + value?: PropDefaultValue, + required?: boolean; + validator?: PropValidatorFunction; +} + +export type RecordPropsDefinition = { + [K in keyof T]: PropValidator +} +export type PropsDefinition = RecordPropsDefinition; + + +declare function extend({ props }: { props: PropsDefinition }): PropsDefinition; + +interface MyType { + valid: boolean; +} + +const r = extend({ + props: { + notResolved: { + type: Object as PropType, + validator: x => { + return x.valid; + } + }, + explicit: { + type: Object as PropType, + validator: (x: MyType) => { + return x.valid; + } + } + } +}) + +r.explicit +r.notResolved +r.explicit.required +r.notResolved.required + +// Modified repro from #30505 + +type Box = { + contents?: T; + contains?(content: T): boolean; +}; + +type Mapped = { + [K in keyof T]: Box; +} + +declare function id(arg: Mapped): Mapped; + +// All properties have inferable types + +const obj1 = id({ + foo: { + contents: "" + } +}); + +// Some properties have inferable types + +const obj2 = id({ + foo: { + contents: "", + contains(k) { + return k.length > 0; + } + } +}); + +// No properties have inferable types + +const obj3 = id({ + foo: { + contains(k) { + return k.length > 0; + } + } +}); + + +//// [reverseMappedPartiallyInferableTypes.js] +"use strict"; +// Repro from #30505 +exports.__esModule = true; +var r = extend({ + props: { + notResolved: { + type: Object, + validator: function (x) { + return x.valid; + } + }, + explicit: { + type: Object, + validator: function (x) { + return x.valid; + } + } + } +}); +r.explicit; +r.notResolved; +r.explicit.required; +r.notResolved.required; +// All properties have inferable types +var obj1 = id({ + foo: { + contents: "" + } +}); +// Some properties have inferable types +var obj2 = id({ + foo: { + contents: "", + contains: function (k) { + return k.length > 0; + } + } +}); +// No properties have inferable types +var obj3 = id({ + foo: { + contains: function (k) { + return k.length > 0; + } + } +}); diff --git a/tests/baselines/reference/reverseMappedPartiallyInferableTypes.symbols b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.symbols new file mode 100644 index 0000000000000..ac264a37e9ebc --- /dev/null +++ b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.symbols @@ -0,0 +1,259 @@ +=== tests/cases/compiler/reverseMappedPartiallyInferableTypes.ts === +// Repro from #30505 + +export type Prop = { (): T } +>Prop : Symbol(Prop, Decl(reverseMappedPartiallyInferableTypes.ts, 0, 0)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 2, 17)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 2, 17)) + +export type PropType = Prop; +>PropType : Symbol(PropType, Decl(reverseMappedPartiallyInferableTypes.ts, 2, 31)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 3, 21)) +>Prop : Symbol(Prop, Decl(reverseMappedPartiallyInferableTypes.ts, 0, 0)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 3, 21)) + +export type PropDefaultValue = T; +>PropDefaultValue : Symbol(PropDefaultValue, Decl(reverseMappedPartiallyInferableTypes.ts, 3, 34)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 4, 29)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 4, 29)) + + +export type PropValidatorFunction = (value: T) => boolean; +>PropValidatorFunction : Symbol(PropValidatorFunction, Decl(reverseMappedPartiallyInferableTypes.ts, 4, 36)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 7, 34)) +>value : Symbol(value, Decl(reverseMappedPartiallyInferableTypes.ts, 7, 40)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 7, 34)) + +export type PropValidator = PropOptions; +>PropValidator : Symbol(PropValidator, Decl(reverseMappedPartiallyInferableTypes.ts, 7, 61)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 8, 26)) +>PropOptions : Symbol(PropOptions, Decl(reverseMappedPartiallyInferableTypes.ts, 8, 46)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 8, 26)) + + +export type PropOptions = { +>PropOptions : Symbol(PropOptions, Decl(reverseMappedPartiallyInferableTypes.ts, 8, 46)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 11, 24)) + + type: PropType; +>type : Symbol(type, Decl(reverseMappedPartiallyInferableTypes.ts, 11, 30)) +>PropType : Symbol(PropType, Decl(reverseMappedPartiallyInferableTypes.ts, 2, 31)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 11, 24)) + + value?: PropDefaultValue, +>value : Symbol(value, Decl(reverseMappedPartiallyInferableTypes.ts, 12, 22)) +>PropDefaultValue : Symbol(PropDefaultValue, Decl(reverseMappedPartiallyInferableTypes.ts, 3, 34)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 11, 24)) + + required?: boolean; +>required : Symbol(required, Decl(reverseMappedPartiallyInferableTypes.ts, 14, 32)) + + validator?: PropValidatorFunction; +>validator : Symbol(validator, Decl(reverseMappedPartiallyInferableTypes.ts, 15, 23)) +>PropValidatorFunction : Symbol(PropValidatorFunction, Decl(reverseMappedPartiallyInferableTypes.ts, 4, 36)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 11, 24)) +} + +export type RecordPropsDefinition = { +>RecordPropsDefinition : Symbol(RecordPropsDefinition, Decl(reverseMappedPartiallyInferableTypes.ts, 17, 1)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 19, 34)) + + [K in keyof T]: PropValidator +>K : Symbol(K, Decl(reverseMappedPartiallyInferableTypes.ts, 20, 5)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 19, 34)) +>PropValidator : Symbol(PropValidator, Decl(reverseMappedPartiallyInferableTypes.ts, 7, 61)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 19, 34)) +>K : Symbol(K, Decl(reverseMappedPartiallyInferableTypes.ts, 20, 5)) +} +export type PropsDefinition = RecordPropsDefinition; +>PropsDefinition : Symbol(PropsDefinition, Decl(reverseMappedPartiallyInferableTypes.ts, 21, 1)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 22, 28)) +>RecordPropsDefinition : Symbol(RecordPropsDefinition, Decl(reverseMappedPartiallyInferableTypes.ts, 17, 1)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 22, 28)) + + +declare function extend({ props }: { props: PropsDefinition }): PropsDefinition; +>extend : Symbol(extend, Decl(reverseMappedPartiallyInferableTypes.ts, 22, 58)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 24)) +>props : Symbol(props, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 28)) +>props : Symbol(props, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 39)) +>PropsDefinition : Symbol(PropsDefinition, Decl(reverseMappedPartiallyInferableTypes.ts, 21, 1)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 24)) +>PropsDefinition : Symbol(PropsDefinition, Decl(reverseMappedPartiallyInferableTypes.ts, 21, 1)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 24)) + +interface MyType { +>MyType : Symbol(MyType, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 90)) + + valid: boolean; +>valid : Symbol(MyType.valid, Decl(reverseMappedPartiallyInferableTypes.ts, 27, 18)) +} + +const r = extend({ +>r : Symbol(r, Decl(reverseMappedPartiallyInferableTypes.ts, 31, 5)) +>extend : Symbol(extend, Decl(reverseMappedPartiallyInferableTypes.ts, 22, 58)) + + props: { +>props : Symbol(props, Decl(reverseMappedPartiallyInferableTypes.ts, 31, 18)) + + notResolved: { +>notResolved : Symbol(notResolved, Decl(reverseMappedPartiallyInferableTypes.ts, 32, 12)) + + type: Object as PropType, +>type : Symbol(type, Decl(reverseMappedPartiallyInferableTypes.ts, 33, 22)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>PropType : Symbol(PropType, Decl(reverseMappedPartiallyInferableTypes.ts, 2, 31)) +>MyType : Symbol(MyType, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 90)) + + validator: x => { +>validator : Symbol(validator, Decl(reverseMappedPartiallyInferableTypes.ts, 34, 45)) +>x : Symbol(x, Decl(reverseMappedPartiallyInferableTypes.ts, 35, 22)) + + return x.valid; +>x.valid : Symbol(MyType.valid, Decl(reverseMappedPartiallyInferableTypes.ts, 27, 18)) +>x : Symbol(x, Decl(reverseMappedPartiallyInferableTypes.ts, 35, 22)) +>valid : Symbol(MyType.valid, Decl(reverseMappedPartiallyInferableTypes.ts, 27, 18)) + } + }, + explicit: { +>explicit : Symbol(explicit, Decl(reverseMappedPartiallyInferableTypes.ts, 38, 10)) + + type: Object as PropType, +>type : Symbol(type, Decl(reverseMappedPartiallyInferableTypes.ts, 39, 19)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>PropType : Symbol(PropType, Decl(reverseMappedPartiallyInferableTypes.ts, 2, 31)) +>MyType : Symbol(MyType, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 90)) + + validator: (x: MyType) => { +>validator : Symbol(validator, Decl(reverseMappedPartiallyInferableTypes.ts, 40, 45)) +>x : Symbol(x, Decl(reverseMappedPartiallyInferableTypes.ts, 41, 24)) +>MyType : Symbol(MyType, Decl(reverseMappedPartiallyInferableTypes.ts, 25, 90)) + + return x.valid; +>x.valid : Symbol(MyType.valid, Decl(reverseMappedPartiallyInferableTypes.ts, 27, 18)) +>x : Symbol(x, Decl(reverseMappedPartiallyInferableTypes.ts, 41, 24)) +>valid : Symbol(MyType.valid, Decl(reverseMappedPartiallyInferableTypes.ts, 27, 18)) + } + } + } +}) + +r.explicit +>r.explicit : Symbol(explicit, Decl(reverseMappedPartiallyInferableTypes.ts, 38, 10)) +>r : Symbol(r, Decl(reverseMappedPartiallyInferableTypes.ts, 31, 5)) +>explicit : Symbol(explicit, Decl(reverseMappedPartiallyInferableTypes.ts, 38, 10)) + +r.notResolved +>r.notResolved : Symbol(notResolved, Decl(reverseMappedPartiallyInferableTypes.ts, 32, 12)) +>r : Symbol(r, Decl(reverseMappedPartiallyInferableTypes.ts, 31, 5)) +>notResolved : Symbol(notResolved, Decl(reverseMappedPartiallyInferableTypes.ts, 32, 12)) + +r.explicit.required +>r.explicit.required : Symbol(required, Decl(reverseMappedPartiallyInferableTypes.ts, 14, 32)) +>r.explicit : Symbol(explicit, Decl(reverseMappedPartiallyInferableTypes.ts, 38, 10)) +>r : Symbol(r, Decl(reverseMappedPartiallyInferableTypes.ts, 31, 5)) +>explicit : Symbol(explicit, Decl(reverseMappedPartiallyInferableTypes.ts, 38, 10)) +>required : Symbol(required, Decl(reverseMappedPartiallyInferableTypes.ts, 14, 32)) + +r.notResolved.required +>r.notResolved.required : Symbol(required, Decl(reverseMappedPartiallyInferableTypes.ts, 14, 32)) +>r.notResolved : Symbol(notResolved, Decl(reverseMappedPartiallyInferableTypes.ts, 32, 12)) +>r : Symbol(r, Decl(reverseMappedPartiallyInferableTypes.ts, 31, 5)) +>notResolved : Symbol(notResolved, Decl(reverseMappedPartiallyInferableTypes.ts, 32, 12)) +>required : Symbol(required, Decl(reverseMappedPartiallyInferableTypes.ts, 14, 32)) + +// Modified repro from #30505 + +type Box = { +>Box : Symbol(Box, Decl(reverseMappedPartiallyInferableTypes.ts, 51, 22)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 55, 9)) + + contents?: T; +>contents : Symbol(contents, Decl(reverseMappedPartiallyInferableTypes.ts, 55, 15)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 55, 9)) + + contains?(content: T): boolean; +>contains : Symbol(contains, Decl(reverseMappedPartiallyInferableTypes.ts, 56, 17)) +>content : Symbol(content, Decl(reverseMappedPartiallyInferableTypes.ts, 57, 14)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 55, 9)) + +}; + +type Mapped = { +>Mapped : Symbol(Mapped, Decl(reverseMappedPartiallyInferableTypes.ts, 58, 2)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 60, 12)) + + [K in keyof T]: Box; +>K : Symbol(K, Decl(reverseMappedPartiallyInferableTypes.ts, 61, 5)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 60, 12)) +>Box : Symbol(Box, Decl(reverseMappedPartiallyInferableTypes.ts, 51, 22)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 60, 12)) +>K : Symbol(K, Decl(reverseMappedPartiallyInferableTypes.ts, 61, 5)) +} + +declare function id(arg: Mapped): Mapped; +>id : Symbol(id, Decl(reverseMappedPartiallyInferableTypes.ts, 62, 1)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 64, 20)) +>arg : Symbol(arg, Decl(reverseMappedPartiallyInferableTypes.ts, 64, 23)) +>Mapped : Symbol(Mapped, Decl(reverseMappedPartiallyInferableTypes.ts, 58, 2)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 64, 20)) +>Mapped : Symbol(Mapped, Decl(reverseMappedPartiallyInferableTypes.ts, 58, 2)) +>T : Symbol(T, Decl(reverseMappedPartiallyInferableTypes.ts, 64, 20)) + +// All properties have inferable types + +const obj1 = id({ +>obj1 : Symbol(obj1, Decl(reverseMappedPartiallyInferableTypes.ts, 68, 5)) +>id : Symbol(id, Decl(reverseMappedPartiallyInferableTypes.ts, 62, 1)) + + foo: { +>foo : Symbol(foo, Decl(reverseMappedPartiallyInferableTypes.ts, 68, 17)) + + contents: "" +>contents : Symbol(contents, Decl(reverseMappedPartiallyInferableTypes.ts, 69, 10)) + } +}); + +// Some properties have inferable types + +const obj2 = id({ +>obj2 : Symbol(obj2, Decl(reverseMappedPartiallyInferableTypes.ts, 76, 5)) +>id : Symbol(id, Decl(reverseMappedPartiallyInferableTypes.ts, 62, 1)) + + foo: { +>foo : Symbol(foo, Decl(reverseMappedPartiallyInferableTypes.ts, 76, 17)) + + contents: "", +>contents : Symbol(contents, Decl(reverseMappedPartiallyInferableTypes.ts, 77, 10)) + + contains(k) { +>contains : Symbol(contains, Decl(reverseMappedPartiallyInferableTypes.ts, 78, 21)) +>k : Symbol(k, Decl(reverseMappedPartiallyInferableTypes.ts, 79, 17)) + + return k.length > 0; +>k.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) +>k : Symbol(k, Decl(reverseMappedPartiallyInferableTypes.ts, 79, 17)) +>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) + } + } +}); + +// No properties have inferable types + +const obj3 = id({ +>obj3 : Symbol(obj3, Decl(reverseMappedPartiallyInferableTypes.ts, 87, 5)) +>id : Symbol(id, Decl(reverseMappedPartiallyInferableTypes.ts, 62, 1)) + + foo: { +>foo : Symbol(foo, Decl(reverseMappedPartiallyInferableTypes.ts, 87, 17)) + + contains(k) { +>contains : Symbol(contains, Decl(reverseMappedPartiallyInferableTypes.ts, 88, 10)) +>k : Symbol(k, Decl(reverseMappedPartiallyInferableTypes.ts, 89, 17)) + + return k.length > 0; +>k : Symbol(k, Decl(reverseMappedPartiallyInferableTypes.ts, 89, 17)) + } + } +}); + diff --git a/tests/baselines/reference/reverseMappedPartiallyInferableTypes.types b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.types new file mode 100644 index 0000000000000..49cd5cf8962ce --- /dev/null +++ b/tests/baselines/reference/reverseMappedPartiallyInferableTypes.types @@ -0,0 +1,231 @@ +=== tests/cases/compiler/reverseMappedPartiallyInferableTypes.ts === +// Repro from #30505 + +export type Prop = { (): T } +>Prop : Prop + +export type PropType = Prop; +>PropType : Prop + +export type PropDefaultValue = T; +>PropDefaultValue : T + + +export type PropValidatorFunction = (value: T) => boolean; +>PropValidatorFunction : PropValidatorFunction +>value : T + +export type PropValidator = PropOptions; +>PropValidator : PropOptions + + +export type PropOptions = { +>PropOptions : PropOptions + + type: PropType; +>type : Prop + + value?: PropDefaultValue, +>value : T | undefined + + required?: boolean; +>required : boolean | undefined + + validator?: PropValidatorFunction; +>validator : PropValidatorFunction | undefined +} + +export type RecordPropsDefinition = { +>RecordPropsDefinition : RecordPropsDefinition + + [K in keyof T]: PropValidator +} +export type PropsDefinition = RecordPropsDefinition; +>PropsDefinition : RecordPropsDefinition + + +declare function extend({ props }: { props: PropsDefinition }): PropsDefinition; +>extend : ({ props }: { props: RecordPropsDefinition; }) => RecordPropsDefinition +>props : RecordPropsDefinition +>props : RecordPropsDefinition + +interface MyType { + valid: boolean; +>valid : boolean +} + +const r = extend({ +>r : RecordPropsDefinition<{ notResolved: MyType; explicit: MyType; }> +>extend({ props: { notResolved: { type: Object as PropType, validator: x => { return x.valid; } }, explicit: { type: Object as PropType, validator: (x: MyType) => { return x.valid; } } }}) : RecordPropsDefinition<{ notResolved: MyType; explicit: MyType; }> +>extend : ({ props }: { props: RecordPropsDefinition; }) => RecordPropsDefinition +>{ props: { notResolved: { type: Object as PropType, validator: x => { return x.valid; } }, explicit: { type: Object as PropType, validator: (x: MyType) => { return x.valid; } } }} : { props: { notResolved: { type: Prop; validator: (x: MyType) => boolean; }; explicit: { type: Prop; validator: (x: MyType) => boolean; }; }; } + + props: { +>props : { notResolved: { type: Prop; validator: (x: MyType) => boolean; }; explicit: { type: Prop; validator: (x: MyType) => boolean; }; } +>{ notResolved: { type: Object as PropType, validator: x => { return x.valid; } }, explicit: { type: Object as PropType, validator: (x: MyType) => { return x.valid; } } } : { notResolved: { type: Prop; validator: (x: MyType) => boolean; }; explicit: { type: Prop; validator: (x: MyType) => boolean; }; } + + notResolved: { +>notResolved : { type: Prop; validator: (x: MyType) => boolean; } +>{ type: Object as PropType, validator: x => { return x.valid; } } : { type: Prop; validator: (x: MyType) => boolean; } + + type: Object as PropType, +>type : Prop +>Object as PropType : Prop +>Object : ObjectConstructor + + validator: x => { +>validator : (x: MyType) => boolean +>x => { return x.valid; } : (x: MyType) => boolean +>x : MyType + + return x.valid; +>x.valid : boolean +>x : MyType +>valid : boolean + } + }, + explicit: { +>explicit : { type: Prop; validator: (x: MyType) => boolean; } +>{ type: Object as PropType, validator: (x: MyType) => { return x.valid; } } : { type: Prop; validator: (x: MyType) => boolean; } + + type: Object as PropType, +>type : Prop +>Object as PropType : Prop +>Object : ObjectConstructor + + validator: (x: MyType) => { +>validator : (x: MyType) => boolean +>(x: MyType) => { return x.valid; } : (x: MyType) => boolean +>x : MyType + + return x.valid; +>x.valid : boolean +>x : MyType +>valid : boolean + } + } + } +}) + +r.explicit +>r.explicit : PropOptions +>r : RecordPropsDefinition<{ notResolved: MyType; explicit: MyType; }> +>explicit : PropOptions + +r.notResolved +>r.notResolved : PropOptions +>r : RecordPropsDefinition<{ notResolved: MyType; explicit: MyType; }> +>notResolved : PropOptions + +r.explicit.required +>r.explicit.required : boolean | undefined +>r.explicit : PropOptions +>r : RecordPropsDefinition<{ notResolved: MyType; explicit: MyType; }> +>explicit : PropOptions +>required : boolean | undefined + +r.notResolved.required +>r.notResolved.required : boolean | undefined +>r.notResolved : PropOptions +>r : RecordPropsDefinition<{ notResolved: MyType; explicit: MyType; }> +>notResolved : PropOptions +>required : boolean | undefined + +// Modified repro from #30505 + +type Box = { +>Box : Box + + contents?: T; +>contents : T | undefined + + contains?(content: T): boolean; +>contains : ((content: T) => boolean) | undefined +>content : T + +}; + +type Mapped = { +>Mapped : Mapped + + [K in keyof T]: Box; +} + +declare function id(arg: Mapped): Mapped; +>id : (arg: Mapped) => Mapped +>arg : Mapped + +// All properties have inferable types + +const obj1 = id({ +>obj1 : Mapped<{ foo: string; }> +>id({ foo: { contents: "" }}) : Mapped<{ foo: string; }> +>id : (arg: Mapped) => Mapped +>{ foo: { contents: "" }} : { foo: { contents: string; }; } + + foo: { +>foo : { contents: string; } +>{ contents: "" } : { contents: string; } + + contents: "" +>contents : string +>"" : "" + } +}); + +// Some properties have inferable types + +const obj2 = id({ +>obj2 : Mapped<{ foo: string; }> +>id({ foo: { contents: "", contains(k) { return k.length > 0; } }}) : Mapped<{ foo: string; }> +>id : (arg: Mapped) => Mapped +>{ foo: { contents: "", contains(k) { return k.length > 0; } }} : { foo: { contents: string; contains(k: string): boolean; }; } + + foo: { +>foo : { contents: string; contains(k: string): boolean; } +>{ contents: "", contains(k) { return k.length > 0; } } : { contents: string; contains(k: string): boolean; } + + contents: "", +>contents : string +>"" : "" + + contains(k) { +>contains : (k: string) => boolean +>k : string + + return k.length > 0; +>k.length > 0 : boolean +>k.length : number +>k : string +>length : number +>0 : 0 + } + } +}); + +// No properties have inferable types + +const obj3 = id({ +>obj3 : Mapped +>id({ foo: { contains(k) { return k.length > 0; } }}) : Mapped +>id : (arg: Mapped) => Mapped +>{ foo: { contains(k) { return k.length > 0; } }} : { foo: { contains(k: unknown): boolean; }; } + + foo: { +>foo : { contains(k: unknown): boolean; } +>{ contains(k) { return k.length > 0; } } : { contains(k: unknown): boolean; } + + contains(k) { +>contains : (k: unknown) => boolean +>k : unknown + + return k.length > 0; +>k.length > 0 : boolean +>k.length : any +>k : unknown +>length : any +>0 : 0 + } + } +}); +