Как проверить, имеет ли тип подпись индекса во время выполнения

#typescript

#typescript

Вопрос:

Я не уверен, имеет ли это какой-либо смысл, потому что многие типы являются объектами в JavaScript, но здесь мы идем:

Я хочу реализовать защиту типа, которая проверяет, реализует ли тип подпись индекса. Как бы это сделать?

Другими словами, как реализовать тело этой функции:

 function hasIndexSignature(o: complexunioninterface | { [index: string]: string }): o is { [index: string]: string } {
    return /* Help? */;
}
  

Учитывая, что многие типы являются объектами, является ли правильная реализация этой:

 function hasIndexSignature(o: complexunioninterface | { [index: string]: string }): o is { [index: string]: string } {
    return typeof o === "object";
}
  

Одним из способов было бы реализовать защиту типа для complexunioninterface и просто отрицать это, но мне интересно, будет ли иметь смысл реализация защиты типа для подписи индекса, и если это возможно.

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

1. Вы, вероятно, не можете. Почему вы хотели бы знать что-то подобное? Можете ли вы отредактировать свой вопрос и добавить сценарий реального мира?

2. Возможно, вы сможете выполнить эту работу, используя API-интерфейс отражения метаданных, в зависимости от того, какую информацию о типе typescript автоматически аннотирует там (и средство защиты типов, которое проверяет его), но в остальном я с @NitzanTomer

3. Единственное, что отдаленно имеет смысл, это перечислить все свойства и проверить, является ли каждое из них строкой — это то { [index: string]: string } , что в основном означает подпись индекса. Будет ли это достаточно хорошо, чтобы отличить от compexunioninterface или нет — я понятия не имею.

4. Ну, я только начал изучать TypeScript. Я обнаружил, что пишу охранники для объединенного типа headers?: HeaderInit | { [index: string]: string }; выборки узлов , чтобы информация о типе находилась внутри моих if else блоков и. В этом случае я просто написал защиту для HeaderInit , но, как я учусь, мне было любопытно, можно ли написать общую защиту для { [index: string]: string } и будет ли это иметь какой-либо смысл. Спасибо за ответы.

Ответ №1:

Мне интересно, будет ли иметь смысл реализовать защиту типа для подписи индекса и возможно ли это.

Защита пользовательского типа предназначена для случая, когда компилятор не может вывести расширенные знания, которые у вас есть об объектах.

Так что, на самом деле, вам решать, какой объем теста достаточен. Я бы сказал, придерживайтесь своей идеи implement a type guard for complexunioninterface and just negate that,