#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 — хороший выбор).