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

Pav*_*nin 7 typescript

考虑我已导出界面

export interface IMyAngularService{
}
Run Code Online (Sandbox Code Playgroud)

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

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

class MyController{

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

    constructor(...dependencies){
    }
}
Run Code Online (Sandbox Code Playgroud)

其中dependency函数通常从接口名称获取服务名称.因此,无论何时ISomeService1更改名称,结果JavaScript都包含更改的字符串.

cur*_*rpa 19

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

  • 这太可惜了. (29认同)
  • 真丢脸。`nameof IMyAngularService` 在编译时实现以扩展为 `"IMyAngularService"` 似乎很简单;这将节省一些重构工作。 (9认同)

小智 7

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

interface Blueberry { strawberry: boolean; }
interface Car { vehicle: number; }

interface Interfaces {
    Blueberry: Blueberry;
    Car: Car;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样获取接口的名称:

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>;
Run Code Online (Sandbox Code Playgroud)

  • 如果编译器为我们做到这一点,那就太好了...将所有接口添加到一个系统类中,以便我们可以找到它们.. (2认同)