Типизированные аргументы по умолчанию в параметрах деструктурирования

#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 .