打字稿:在通用接口中采用类型和 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" });

(code in playground)

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

interface Record {
    id?: string;
}

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

但随后您将无法强制执行 updateRecord returns 具有 id 的对象。