Adding new syntax is very costly because it requires changes to the Python interpreter and/or many classes of tools (linters, type checkers, stub generators, etc.). It also requires users to understand a new syntactic form, so it comes with a cognitive burden. Any such proposed change should have a very compelling motivation. I recommend starting with a clear and compelling problem statement before proposing a syntax change.
PEP 695 proposed a new type statement because type aliases can be generic. Since PEP 695 was proposing a new way to declare type parameters, it needed to address type aliases. Also, generic type aliases are frequently used incorrectly today. Users tend to omit the type arguments when using a generic because they don’t realize that type arguments are needed. The new type statement in PEP 695 helps to eliminate that confusion by making it more obvious that a generic type alias has one or more type parameters associated with it.
What problem would a new syntax for NewType solve? The use of NewType is relatively rare compared to the use of type aliases. NewType doesn’t support generics, and in my experience, users of NewType are not confused about how it is intended to be used. For those reasons, I don’t see a compelling need to provide a new syntax here. It would save a few keystrokes, but since NewType is not used very often and is a more obscure and advanced feature of the type system, I don’t think that comes close to meeting the bar required to justify a syntax change — or new special casing in type checkers.
You might be able to make a more compelling case if you could gather data that shows NewType is used frequently in current code bases, but I would be surprised if the data backed that up.
A counterpoint would be that introducing brand new type OrderId = int syntax is much more involved than introducing type OrderId = NewType[int] syntax on top of the former one. (I’m not fond of the type OrderId(int) idea, so I’m not arguing about it here.)
I use NewType frequently enough for me the new syntax to be beneficial. Repeating type name is so awkward…
I agree with @erictraut that the bar for introducing a syntax change is high and that NewType probably isn’t commonly enough used to merit special syntactic support.
However if NewTypewere to merit syntactic support in the future, I might advocate that:
from typing import NewType
OrderId = NewType("OrderId", int)
be phrasable using both the new and type keywords as:
new type OrderId = int # a NewType
which would align nicely with the similar type alias:
type OrderId = int # an alias
The use of pseudo-expressions like NewType[int] or NewType(int) presented earlier in this thread seem confusing to me because they look like expressions on their own but are actually part of a larger syntactic form that just spans an entire line.