Файл определения: несколько возможных типов для свойства

123
16

Я пишу некоторые определения для существующей библиотеки JS (CKEditor). Возможно ли быть более конкретным, чем toolbar: any?


Документация:


панель инструментов: массив/строка

Определение панели инструментов (псевдонимы). Это имя панели инструментов или массив панелей инструментов (полос), каждый из которых также является массивом, содержащий список элементов пользовательского интерфейса.



Код библиотеки:


var toolbar = editor.config.toolbar;

// If it is a string, return the relative "toolbar_name" config.
if ( typeof toolbar == 'string' )
toolbar = editor.config[ 'toolbar_' + toolbar ];

return ( editor.toolbar = toolbar ? populateToolbarConfig( toolbar ) : buildToolbarConfig() );

спросил(а) 2013-07-12T15:48:00+04:00 7 лет, 3 месяца назад
1
Решение
166

Typescript 1.4 теперь поддерживает типы объединения


Конечно, вам все равно нужно проверить значение внутри функции и соответственно отреагировать, но теперь вы можете получить проверку времени компиляции, не меняя тип на any.

function f(x: number | number[]) {
if (typeof x === "number") {
return x + 10;
}
else {
// return sum of numbers
}
}

http://blogs.msdn.com/b/typescript/archive/2015/01/16/announcing-typescript-1-4.aspx

ответил(а) 2015-05-11T09:07:00+03:00 5 лет, 5 месяцев назад
70

К сожалению, Typescript не поддерживает типы объединения и вряд ли сделает это в ближайшем будущем.


В потоке есть два предложения:

    Перегрузка функций
    Дженерики

В данном фрагменте кода я не вижу, чтобы избежать типа any. Однако вне фрагмента, если аргумент toolbar передается как аргумент, функция перегрузки может быть способна выразить тип этих.

ответил(а) 2013-07-12T18:20:00+04:00 7 лет, 3 месяца назад
58

Можно моделировать, что панель инструментов представляет собой массив Array и.


interface ArrayAndString extends Array, String { }
var toolbar: ArrayAndString = editor.config.toolbar;

Это говорит о том, что операции с массивом и строкой являются законными, что на самом деле не так, и не обеспечивает гораздо лучшую безопасность, чем any. Нет способа смоделировать то, что он может быть тем или иным, но не тем и другим.

ответил(а) 2013-07-12T21:34:00+04:00 7 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема