Thanks so much, it helps to get some context about the ongoing discussions 
I would like to elaborate a bit more. The current typealias syntax is really just a type transformation, with an input and an output:
typealias NewType1 = String
// Transformation name: NewType1
// Transformation input: Void
// Transformation output: String
Another example:
typealias NewType2<T> = Array<T>
// Transformation name: NewType2
// Transformation input: T
// Transformation output: Array<T>
So we could think about typealias as if they were functions:
func newType1() -> String { fatalError() }
typealias NewType1 = String
func newType2<T>(_: T) -> Array<T> { fatalError() }
typealias NewType2<T> = Array<T>
func newType3<T>(_: T) -> Array<T> where T: Equatable { fatalError() }
typealias NewType3<T> = Array<T> where T: Equatable
That make sense: our existing syntax for typealias does match our existing syntax for functions, at least when looking at simple type transformations.
But what happens when we look at more complex ones? What would be the equivalent typealias for the following function?
func getType<Parent, MemberType>(_: (Parent) -> MemberType) -> MemberType { fatalError() }
// The equivalent typealias name would be GetType
The usecase is the same one mentioned above: infer the type of a property from the type of an existing member. For example, if we could define the equivalent typealias for the above function, then it would be possible to do:
struct Dependencies {
let fetch: GetType<NetworkService.fetch>
}
About the syntax for that last case, it is a bit uncertain. If extending existing syntax to support this, I am not sure the following will work in every case:
typealias GetType<(Parent) -> MemberType> = MemberType
Maybe we would need some new keyword:
typetransform GetType<(Parent) -> MemberType> = MemberType
Thoughts?