-
Notifications
You must be signed in to change notification settings - Fork 13k
Description
One common thing I use type-aliases for is to give shorter, more expressive names to commonly used types throughout a file.
This is especially useful for callback signatures that see common use throughout a module, as well as string-literal types used in a union type, like type HttpMethods = 'get' | 'post' | 'put' | 'delete'
.
Let's look at the following simplified example:
type CharCallback = (c: string, i: number) => string;
export function mapOnChar(str: string, fn: CharCallback): string {
const newStr = [];
for (let i = 0, lim = str.length; i < lim; i++)
newStr.push(fn(str.charAt(i), i));
return newStr.join('');
}
When using the declaration
compiler option, this example fails to compile with the following error:
error TS4078: Parameter 'fn' of exported function has or is using private name 'CharCallback'.
This initially makes sense; the type-alias is not being exported so it is private. However, if you look at the type-alias, the only thing "private" about it is the name it was given, and an alias' name is not really important to or needed for a definition file.
There is no reason that the un-exported type-alias in the example cannot be automatically de-aliased back into (c: string, i: number) => string
and that used in its place when the definition file is emitted.
However, if the alias in the example were to be exported, then it should not be de-aliased in the definition file.
I should point out that this suggestion is considering type-aliases only. If the CharCallback
type was re-written as interface CharCallback { (c: string, i: number): string }
, then that would be a good case to raise an error. An interface
is generally considered more "concrete" than a simple type-alias, and so its name should be preserved and used in the definition file.