#typescript #types #typescript2.0
#typescript #типы #typescript2.0
Вопрос:
Одной из моих любимых функций es6 является возможность использования параметров деструктурирования. Например:
function example1({
bar = -1,
transform = Math.abs
} = {}) {
transform(bar);
}
Однако компилятор typescript выдает ошибку, когда одному из аргументов необходимо назначить явный тип (например, для придания ему большей гибкости, чем предполагалось бы по умолчанию):
type Formatter = { (n: number): (number | string) };
function example2({
bar = -1,
transform: Formatter = Math.abs
} = {}) {
// ERROR: cannot find name 'transform'
return transform(bar) ' is the value';
}
Единственный способ обойти это, который я нашел, — это явно ввести весь набор параметров, что кажется чрезмерно сложным, когда можно определить остальные типы параметров:
type Formatter = { (n: number): (number | string) };
type ExampleOpts = {
bar?: number,
transform?: Formatter
};
function example3({
bar = -1,
transform= Math.abs
}: ExampleOpts = {}) {
return transform(bar) ' is the value';
}
Мысли? Есть ли синтаксис, который выполняет # 3 с простотой # 2, которую мне не хватает?
Ответ №1:
type Formatter = { (n: number): (number | string) };
function example2({
bar = -1,
transform = Math.abs as Formatter
} = {}) {
// ERROR: cannot find name 'transform'
return transform(bar) ' is the value';
}
При использовании параметров по умолчанию вы стремитесь к выводу типа. Если нет определения типа или вы хотите предоставить свое собственное, просто приведите его с помощью синтаксиса «переменная как тип»! 🙂
Комментарии:
1. Интересно. Я не думал о способности принуждения к типу расширять тип — обычно я видел, как это используется для сужения типа. Кроме того, существует связанная с этим проблема, заключающаяся в том, что параметры деструктурирования не могут содержать никаких типизированных параметров без значений по умолчанию (обязательных или необязательных) — по крайней мере, без явного ввода, как in
example3
.