Skip to content

[bug] Type of nested properties are not fully resolved and fail equality test. #29

@gomain

Description

@gomain
{
  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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions