2016-07-11 2 views
0

Представьте себе простой CollectionStore, который имеет методы для создания и обновления записи. create() принимает набор атрибутов и возвращает тот же набор с добавлением id. update принимает набор той же структуры, но для этого необходимо определить свойство id.Typcript: возьмите тип и верните тип объединения в общий интерфейс

Как выразить в машинописном тексте, что функция create() принимает некоторый тип T и возвращает T & {id: string}?

Я ожидаю, что картина будет выражена так:

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

Однако приведенный выше код не является действительным. Пожалуйста, помогите =)

ответ

1

Вы правы в том, как вы используете тип соединения, но вы не сумели предоставить имена функций Params именно поэтому вы получите сообщение об ошибке, это должно быть:

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 возвращает объект с идентификатором.

Смежные вопросы