Skip to content

Typescript fails to generate an error when comparing deeply nested TypeBox typesΒ #56291

@sanderalvin

Description

@sanderalvin

πŸ”Ž Search Terms

"typebox no Typescript error"

πŸ•— Version & Regression Information

  • This is a crash

⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.3.0-dev.20231031#code/JYWwDg9gTgLgBAbzgZRgQxsAxgGjgFQE8wBTOAXzgDMoIQ4ByAAQGdgA7LAGzWCgHoYxEgCMIADwYBuAFAz+-OADkAgvgCSANQCicbQA0VAWQAKAGV0Baazdu25Q0ihBouXJRmAA3EkScBeRBk4ELguEh8uAEYALiDQhLCIki4AJjiEYMTsqggIOJYYKA4Ac1lskPJy0KqZWplHMgAhYBKPTB8-MkDMhPDI2PiK-pT0oYrQ3Py4QuL2MqyJkJE0KAKi0urs2oTa+oUCAHcIOAATEhIwLkI4dhJCklO4RpY4Eu8yLGgoEix4EigtCgMioAFdOJgIOxbp4fE1VgAKMCrNAgOLIFxudofLoAbQAugBKOItNqw3zCAnjOA-GCgqDQ5FQVGychyA52Tk2dmKfAATRM2iaAHl9HpDKYLHAuVyHMJnK4uF0xOIunBAqhPFgADyNCBUBVuZUSLoAPlkX3YhUNSuEKrVgS6ADphSIAFa-GAI3qhEbROLOlSAtCEBHO10ev7exaJP1jQPB0Ph92e6NLSZ5APCJ2oOYlBGEnAx3aEwsx8ilosV2QNeWk42q+Ua9CYHV6g31u0m4TmmSW62d0j2psEbMR1M+kJ+wYJ5lJscpqOT2PJNJZ0hOoNzsMLyNe5cTKbrkg5jbzAtF9PLVbH095i-FmqV8vP6s86jgv7AKHUPJIlFojaDZdMScCDqI3ZOJkBwhLS9KMgBsgHGy8iKAAwvSPzsDA1zPAAFsAryEXAHBfICnpOnA6jwCwoJgJALCPM8Jx4WgPhwACQJwGgRHQgAROw5LwlAfEceIqJXCQqFUQahAQKCcCfnQIAkNhcB8VMoloGIPgBgRryHMAbhvB8HGAtAcAImRPx-HAIgkKxXjflAhLSeosnyYpnDKap8AaXkon2VwECHHpxGGcZSjCvgJnsZxFkIqR3yenZDlsc5rlghC37QisUD-sygEYoqwGUkSJKtKVpBUsucEMnATIsnU75ZV+P5TAVqLopitpDpBJCgeBw5QdJsEkHS9WNSASGKChHIygtMhAA

πŸ’» Code

import { Static, Type } from '@sinclair/typebox';

// NATIVE EXAMPLE --------------

type SmallNativeType = {
    level1: {
        level2: {
            foo: string;
        };
    };
};

type BigNativeType = {
    level1: {
        level2: {
            foo: string;
            bar: string;
        };
    };
};

// Two deeply nested types give correct error
function nativeBar(param: SmallNativeType[]): BigNativeType[] {
    return param;
}

// --------------

// TYPEBOX EXAMPLE --------------

type SmallTypeboxType = Static<typeof SmallTypeboxType>;
const SmallTypeboxType = Type.Object({
    level1: Type.Array(Type.Object({
        level2: Type.Array(Type.Object({
            foo: Type.String(),
        })),
    })),
});

type BigTypeboxType = Static<typeof BigTypeboxType>;
const BigTypeboxType = Type.Object({
    level1: Type.Array(Type.Object({
        level2: Type.Array(Type.Object({
            foo: Type.String(),
            bar: Type.String(),
        })),
    })),
});

// function foo(param: SmallTypeboxType): BigTypeboxType {
//   return param;
// }

// Currently this is incorrect. It supposed to have error as in "nativeBar" example
// If you uncomment "foo" above: This will give error (correct behavior)
// If you uncomment "foo" below: This will NOT give error (incorrect behavior)
function bar(param: SmallTypeboxType[]): BigTypeboxType[] {
    return param;
}

// function foo(param: SmallTypeboxType): BigTypeboxType {
//   return param;
// }

// ------------------

πŸ™ Actual behavior

No Typescript error generated on line 58 inside bar function.

πŸ™‚ Expected behavior

There should be an TS error on line 58 inside bar function just like there is a similar error inside nativeBar function on line 24.

Additional information about the issue

I first reported this issue to TypeBox repo, but I was advised that this is actually a Typescript problem.
Link to Typebox issue: sinclairzx81/typebox#636

Metadata

Metadata

Assignees

Labels

Design LimitationConstraints of the existing architecture prevent this from being fixed

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions