想象一个简单的CollectionStore
,它有创建和更新记录的方法。 create()
接受一组属性并返回添加了id
属性的同一组。 update
接受相同结构的集合,但需要定义id
属性。
如何在Typescript中表达create()
函数接受某种类型T
并返回T & {id: string}
?
我希望这种模式能够表达出来:
interface CollectionStore<T> {
updateRecord(T & {id: string}): void;
createRecord(T): T & {id: string};
}
但是上面的代码不是有效的。请帮忙=)
答案 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" });
另一个选择是为id
属性是可选的记录提供基本接口:
interface Record {
id?: string;
}
interface CollectionStore<T extends Record> {
updateRecord(record: T): void;
createRecord(record: T): T;
}
但是你失去了强制执行updateRecord
返回带有id的对象的能力。