Typescript: как ссылаться на имя свойства в определении подписи строкового индекса в интерфейсе

#string #typescript #properties #reference #index-signature

#строка #typescript #свойства #ссылка #индекс-подпись

Вопрос:

Иллюстрация

 export interface IEventDef {
    ready: any,
}

export interface IIPCMessage {
    eventType: keyof IEventDef,
    data: IEventDef[this['eventType']]
}

interface IMessageHandlers {
    [eventName: keyof IEventDef]: (data: ) => void
}
  

Вопрос

Согласно иллюстрации, дающей подпись строкового индекса для интерфейса! Как показано ниже:

 interface IMessageHandlers {
    [eventName: keyof IEventDef]: (data: /*HOW_TO_REF_eventName*/) => void
}
  

Как мы можем ссылаться на eventName в моем примере? Или имя свойства индекса! Той же строки

В моем точном коде я хотел сделать это:

 interface IMessageHandlers {
    [eventName: keyof IEventDef]: (data: IEventDef[thisLineProp]) => void
}
  

Что дало бы отличную близость! любым способом?

Для большей ясности я приведу этот фрагмент ниже!

 export interface IEventDef {
    ready: any,
} 

export interface IIPCMessage {
    eventType: keyof IEventDef,
    data: IEventDef[this['eventType']] // <<= here
}
  

В этом примере я смог ссылаться на тот же интерфейс с this помощью ключевого слова! Которые обеспечивают отличную близость типов! И это позволило повысить точность ввода!

Как насчет ссылки и получения имени свойства той же строки из подписи индекса?

Обновить

Я заметил, что я только что встретил

Тип параметра подписи индекса должен быть либо ‘string’, либо ‘number’.ts (1023) `

Ошибка!

И я изменил код на

 type IMessageHandlers = {
    [eventName in keyof IEventDef]: (data: /*REF_THE_PROP_NAME?*/) => void
}
  

И я задаю вопрос по этому поводу?

Комментарии:

1. Можете ли вы привести пример того, как вы хотите его использовать? Из-за недопустимых вводов неясно, каков ожидаемый результат. Если я до сих пор понимаю проблему, ваш последний пример очень близок, если вы замените /*REF_THE_PROP_NAME?*/ на eventName (при условии, что вы хотите data ввести то же самое, что и имя ключа)

2. Да, это то, что это было! Я хочу использовать во второй части то же имя, что и свойство! Итак, с точки зрения использования! Когда выбрано свойство объекта! Сопоставленный элемент будет автоматически определять его тип, правильно и с точностью! И, как вы упомянули! я просто должен был использовать eventName ! Но сначала я попробовал это, но в интерфейсе! И с буквальными строками! и они просто не поддерживаются! И я не пробовал с in синтаксисом. И это было мое плохое ччч! Любые мысли о том, когда нам нужен интерфейс !? Помимо генерации кода! Большое вам спасибо, сэр

Ответ №1:

На самом деле вы почти там. eventName содержит нужный вам тип.

 type IMessageHandlers = {
    [eventName in keyof IEventDef]: (data: eventName) => void
}

  

Ссылка на игровую площадку

Комментарии:

1. Я только что был там! я попробовал! Однако это было в случае интерфейса! В случае интерфейса у нас его нет! И это имеет смысл! Я забыл об ошибке только для строки! И если они не добавят поддержку in и поддержку литерала! Мы ничего не можем сделать! И, короче говоря, это возможно благодаря in синтаксису! И мы можем использовать его в объектных литералах! И мы пропускаем это в интерфейсах! Это было рассмотрено! github.com/microsoft/TypeScript/issues/5683 ! Это может появиться где-нибудь в будущем! Большое вам спасибо, сэр! И был бы признателен за любые дополнительные мысли!

2. Для интерфейсов и проблема поддержки букв! Мы всегда можем сгенерировать интерфейсы! И у нас тоже может быть плагин для этого! с помощью AST (ts-morph — хороший выбор).