{
type ObjectWithProp<PROP> = {
prop: PROP;
};
type MakeNestObject<NEST_OBJECT extends { nestProp: ObjectWithProp<any> }> = {
nestObj: NEST_OBJECT;
};
/* as expected */
expectTypeOf<
MakeNestObject<{ nestProp: ObjectWithProp<"one"> }>
>().toEqualTypeOf<{ nestObj: { nestProp: { prop: "one" } } }>();
expectTypeOf<
MakeNestObject<{ nestProp: ObjectWithProp<"two"> }>
>().toEqualTypeOf<{ nestObj: { nestProp: { prop: "two" } } }>();
/* but */
expectTypeOf<
MakeNestObject<{ nestProp: ObjectWithProp<"one"> }>
>().toEqualTypeOf<MakeNestObject<{ nestProp: ObjectWithProp<"two"> }>>();
/* assignability test, the old fashion way */
let o1: MakeNestObject<{ nestProp: ObjectWithProp<"one"> }> = null as any;
let o2: MakeNestObject<{ nestProp: ObjectWithProp<"two"> }> = null as any;
// @ts-expect-error - type "two" is not assignable to type "one"
o1 = o2;
// @ts-expect-error - type "one" is not assignable to type "two"
o2 = o1;
/* if the nested object type were by different name */
type AnotherName<PROP> = {
prop: PROP;
}
expectTypeOf<
MakeNestObject<{ nestProp: ObjectWithProp<"one"> }>
>().toEqualTypeOf<MakeNestObject<{ nestProp: AnotherName<"one"> }>>();
expectTypeOf<
MakeNestObject<{ nestProp: ObjectWithProp<"one"> }>
>().not.toEqualTypeOf<MakeNestObject<{ nestProp: AnotherName<"two"> }>>();
}
Playground
Playground