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

时间:2015-01-14 14:40:49

标签: typescript

考虑我已导出界面

export interface IMyAngularService{
}

当我们注册服务或工厂时,我们通常使用功能名称作为注册服务的名称或简单地使用可派生的字符串(例如' ISomeService' - >' SomeService');

稍后我可以决定重命名界面,并希望依赖项描述自动更改:

class MyController{

    static $inject = [
        dependency(nameof<ISomeService1>),
        dependency(nameof<ISomeService2>)
    ];

    constructor(...dependencies){
    }
}

其中dependency函数通常从接口名称获取服务名称。因此,只要ISomeService1的名称发生更改,生成的JavaScript就会包含更改的字符串。

2 个答案:

答案 0 :(得分:15)

这是不可能的。 TypeScript不会为接口生成任何代码,也就像nameof运算符一样。

答案 1 :(得分:1)

如果您将所有接口映射到它们的名称,则可以,如下所示。

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