在Typescript中,声明一个接口并在不同的文件中定义它

时间:2018-03-15 23:31:44

标签: typescript

我正在构建一个使用WebSocket和NodeJS包的软件。我围绕一个负责接收和发送消息的模块组织了我的网络。因为我正在使用TypeScript,所以我想使用类型检查,这有时候非常方便。所以我构建了两种类型:

// networking.ts
export class Message {
    constructor(
        public request: string,
        public params: Params) {}
}

export interface Params {
    messageId?: number;
}

只要我只需要messageId作为参数,我就可以正常工作。但是,如果我还需要发送昵称作为参数呢?我可以将它添加到Params定义中,但我不希望网络引擎费心去了解可以发送的所有不同参数(你可以想象我实际上有多个参数要发送) ...

有没有办法做类似的事情:

// profile-params.ts
export interface Params {
    nickname:string;
}

// admin-params.ts
export interface Params {
    authorizations: string[];
}

这样最终,Params的声明可以合并吗?我查看了official documentation但它不能使其适用于不同的文件。

由于

3 个答案:

答案 0 :(得分:2)

@Daniel W Strimpel没问题,如果你的界面不是来自一个模块,你可以把它放在全球范围内。

如果您希望接口成为模块的一部分,您可以使用module augmentation来扩展接口:

public Form1(){
    InitializeComponent();
    listView1.AfterLabelEdit += ListView1_AfterLabelEdit;
}

答案 1 :(得分:0)

使用泛型:

export class Message<P extends Params> {
  constructor(
    public request: string,
    public params: P
  ) { }
}

export interface Params {
  messageId?: number
}

// profile-params.ts
export interface ProfileParams extends Params {
  nickname: string
}

const message = new Message<ProfileParams>('', { nickname: 'a' })

答案 2 :(得分:0)

我现在还不完全知道原因(除了事情是导出的东西,它变成了一个模块),但我知道如何实现这一目标的唯一方法就是让它们进入他们自己的单个文件,没有导出任何内容并导入文件(没有{ Params } from语法)。

// ./message/params.model.ts
interface Params {
    messageId?: number;
}

// ./user/params.model.ts
interface Params {
    nickname: string;
}

// ./authorization/params.model.ts
interface Params {
    authorizations: string[];
}

// ./some.component.ts
import './message/params.model.ts';
import './user/params.model.ts';
import './authorization/params.model.ts';

const params: Params = {
    authorizations: ['black-belt', 'secret-service'],
    nickname: 'ninja',
    messageId: 1
};