Typescript: сопоставленные типы с интерфейсом

При попытке использовать сопоставленные типы с интерфейсом я получаю странную ошибку, которая заставляет меня думать, что их вообще невозможно использовать вместе.

См. идентичные объявления типов и интерфейсов:

type AllWorks<T> = {
    [K in keyof T]: T[K];
}

interface DoesNotWork<T> {
    [K in keyof T]: T[K];
}

В то время как первый работает как положено, второй выдает ошибку TS:

[ts] A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
[ts] Member '[K in keyof' implicitly has an 'any' type.
[ts] Cannot find name 'keyof'.

Итак, мой вопрос: возможно ли вообще отображать интерфейсы? если да - то как?


person c69    schedule 14.03.2018    source источник


Ответы (2)


До сих пор в TypeScript (начиная с версии 2.7.2) сигнатуры типов объединения в интерфейсах не разрешены, и вместо них следует использовать сопоставленные типы (как вы правильно сделали).

Документы.

person Behrooz    schedule 14.03.2018

Интерфейсы не создаются с такой целью. Вместо этого вы должны использовать Type.

Компилятор Typescript говорит вам, что вы используете неправильный инструмент для работы :)

Самое сложное, что может сделать интерфейс, это extend иначе использовать отображаемые типы как общее правило.

Я написал статью здесь о сопоставленных типах, если вы хочется копнуть глубже.

person Jose Greinch    schedule 01.01.2021