打字稿:在通用接口中采用类型和 return 联合类型
Typescript: take a type and return a union type in a generic interface
想象一个简单的 CollectionStore
,它具有创建和更新记录的方法。 create()
接受一组属性和 returns 相同的一组添加 id
属性。 update
接受相同结构的集合,但需要定义 id
属性。
如何在 Typescript 中表达 create()
函数接受某种类型 T
和 returns T & {id: string}
?
我希望模式是这样表达的:
interface CollectionStore<T> {
updateRecord(T & {id: string}): void;
createRecord(T): T & {id: string};
}
但是上面的代码无效。请帮忙=)
你在如何使用联合类型方面是正确的,但是你没有为函数参数提供名称,这就是你得到错误的原因,它应该是:
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
returns 具有 id 的对象。
想象一个简单的 CollectionStore
,它具有创建和更新记录的方法。 create()
接受一组属性和 returns 相同的一组添加 id
属性。 update
接受相同结构的集合,但需要定义 id
属性。
如何在 Typescript 中表达 create()
函数接受某种类型 T
和 returns T & {id: string}
?
我希望模式是这样表达的:
interface CollectionStore<T> {
updateRecord(T & {id: string}): void;
createRecord(T): T & {id: string};
}
但是上面的代码无效。请帮忙=)
你在如何使用联合类型方面是正确的,但是你没有为函数参数提供名称,这就是你得到错误的原因,它应该是:
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
returns 具有 id 的对象。