Skip to content

Why is type assignability for any and enum so permissive? #22464

Closed

Description

Keywords: any, null, undefined, enum, assign, assignable, assignability, permissive, strict

From the spec:

S is assignable to a type T, and T is assignable from S, if S has no excess properties with respect to T (3.11.5) and one of the following is true:

  • S and T are identical types.
  • S or T is the Any type.
  • S is the Undefined type.
  • S is the Null type and T is not the Undefined type.
  • S or T is an enum type and the other is the primitive type Number.

Why is:

  • S assignable to T, if S is any and T is not any?
  • S assignable to T, if S is a number and T is an enum? Because enum <: number, T should be assignable to S, but why is the reverse true? And why is this not the case for string enums?
  • S assignable to T, if S is undefined? (this was a Playground bug where strictNullChecks wasn't actually applied)
  • S assignable to T, if S is null and T is not undefined?

Have you guys considered a flag to opt out of some or all of these behaviors? Or are there real uses cases for them besides interop with untyped JS (or TS in non-strict mode)? I read through the spec and searched issues, but had trouble finding a discussion of why TS made these design decisions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    QuestionAn issue which isn't directly actionable in code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions