是否可以将接口名称作为字符串获取?

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>;