-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Description
The generics proposal says "A type alias may refer to a generic type, but the type alias may not have its own parameters. This restriction exists because it is unclear how to handle a type alias with type parameters that have constraints."
I propose this should be relaxed and type aliases allowed to have their own type parameters. I think there's a clear way to handle type aliases with constrained type parameters: uses of the type alias need to satisfy the constraints, and within the underlying type expression those parameters can be used to instantiate other generic types that they satisfy.
I think it's fine to continue allowing type VectorAlias = Vector as in the proposal, but this should be considered short-hand for type VectorAlias[T any] = Vector[T]. More generally, for generic type B with type parameters [T1 C1, T2 C2, ..., Tn Cn], then type A = B would be the same as type A[T1 C1, T2 C2, ..., Tn Cn] = B[T1, T2, ..., Tn].
In particular, something like this would be an error:
type A[T comparable] int
type B[U any] = A[U] // ERROR: U does not satisfy comparable
type C B[int]
As justification for this, analogous code in the value domain would give an error:
func F(x int) {}
func G(y interface{}) { F(y) } // ERROR: cannot use y (type interface{}) as int
func H() { G(42) }
I suspect if TParams is moved from Named to TypeName and type instantiation is similarly changed to start from the TypeName instead of the Type, then this should work okay.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status