Typescript:获取一个类型并在通用接口

时间:2016-07-11 12:45:09

标签: generics typescript interface unions

想象一个简单的CollectionStore,它有创建和更新记录的方法。 create()接受一组属性并返回添加了id属性的同一组。 update接受相同结构的集合,但需要定义id属性。

如何在Typescript中表达create()函数接受某种类型T并返回T & {id: string}

我希望这种模式能够表达出来:

interface CollectionStore<T> {
    updateRecord(T & {id: string}): void;
    createRecord(T): T & {id: string};
}

但是上面的代码不是有效的。请帮忙=)

1 个答案:

答案 0 :(得分:1)

你在使用联合类型的方式上是正确的,但你没有提供函数参数的名称,这就是你得到错误的原因,它应该是:

interface CollectionStore<T> {
    updateRecord(record: T & { id: string }): void;
    createRecord(record: T): T & { id: string };
}

然后:

interface MyRecord {
    key: string;
}

let a: CollectionStore<MyRecord> = ...;

a.updateRecord({ key: "key", id: "id" });
a.createRecord({ key: "key" });

code in playground

另一个选择是为id属性是可选的记录提供基本接口:

interface Record {
    id?: string;
}

interface CollectionStore<T extends Record> {
    updateRecord(record: T): void;
    createRecord(record: T): T;
}

但是你失去了强制执行updateRecord返回带有id的对象的能力。