是否可以将接口名称作为字符串获取?
Is it possible to get name of the interface as a string?
考虑我已经导出接口
export interface IMyAngularService{
}
当我们注册服务或工厂时,我们通常使用函数名作为注册服务的名称或简单的派生字符串(例如'ISomeService' -> 'SomeService');
稍后我可以决定重命名接口并希望依赖项描述自动更改:
class MyController{
static $inject = [
dependency(nameof<ISomeService1>),
dependency(nameof<ISomeService2>)
];
constructor(...dependencies){
}
}
其中 dependency
函数通常从接口名称获取服务名称。因此,每当更改 ISomeService1
的名称时,结果 JavaScript 包含更改的字符串。
这是不可能的。 TypeScript 不会为接口生成任何代码,也没有像 nameof
运算符这样的东西。
如果您将所有接口映射到它们的名称,就可以,如下所示。
interface Blueberry { strawberry: boolean; }
interface Car { vehicle: number; }
interface Interfaces {
Blueberry: Blueberry;
Car: Car;
}
然后你可以像这样获取接口的名称:
export type RemoveNeverProps<T> = {
[K in Exclude<
keyof T, ({
[P in keyof T]: T[P] extends Function ? P : never
})[keyof T]>
]: T[K]
};
export type IncludeProp<T extends object, E> =
RemoveNeverProps<{ [K in keyof T]: T[K] extends E ? T[K] : never }>;
type Nameof<I extends Interfaces[keyof Interfaces]> =
keyof IncludeProp<Interfaces, I>;
考虑我已经导出接口
export interface IMyAngularService{
}
当我们注册服务或工厂时,我们通常使用函数名作为注册服务的名称或简单的派生字符串(例如'ISomeService' -> 'SomeService');
稍后我可以决定重命名接口并希望依赖项描述自动更改:
class MyController{
static $inject = [
dependency(nameof<ISomeService1>),
dependency(nameof<ISomeService2>)
];
constructor(...dependencies){
}
}
其中 dependency
函数通常从接口名称获取服务名称。因此,每当更改 ISomeService1
的名称时,结果 JavaScript 包含更改的字符串。
这是不可能的。 TypeScript 不会为接口生成任何代码,也没有像 nameof
运算符这样的东西。
如果您将所有接口映射到它们的名称,就可以,如下所示。
interface Blueberry { strawberry: boolean; }
interface Car { vehicle: number; }
interface Interfaces {
Blueberry: Blueberry;
Car: Car;
}
然后你可以像这样获取接口的名称:
export type RemoveNeverProps<T> = {
[K in Exclude<
keyof T, ({
[P in keyof T]: T[P] extends Function ? P : never
})[keyof T]>
]: T[K]
};
export type IncludeProp<T extends object, E> =
RemoveNeverProps<{ [K in keyof T]: T[K] extends E ? T[K] : never }>;
type Nameof<I extends Interfaces[keyof Interfaces]> =
keyof IncludeProp<Interfaces, I>;