Определить аргументы функции как объект в Typescript

Обновление: Пожалуйста, взгляните на комментарии - этот ответ не соответствует вашему вопросу, но, возможно, он отвечает на другие вопросы пользователей, которые натолкнулись (я думаю, что из-за upvotes), поэтому я не буду удалять это " answer ":

Сначала: я знаю, что этот вопрос действительно устарел, но я искал именно эту проблему, и эта публикация была опубликована в Google # 1. Поэтому я реализовал версию docs.filter (принятый ответ), но, как я читал в mongoose v4.6.0 docs , мы теперь можем просто использовать:

Item.find({}).populate({
    path: 'tags',
    match: { tagName: { $in: ['funny', 'politics'] }}
}).exec((err, items) => {
  console.log(items.tags) 
  // contains only tags where tagName is 'funny' or 'politics'
})

Надеемся, что это поможет будущему пользователей поисковой системы.

1
задан SnnSnn 27 February 2019 в 04:45
поделиться

4 ответа

Как насчет:

interface InputObj {
    arg1: number;
    arg2: number;
    arg3: number;
}

interface ExampleProps {
    sum: (input: InputObj) => number
}

Или в строке:

interface ExampleProps {
  sum: (
    input: {
      arg1: number;
      arg2: number;
      arg3: number;
    }
  ) => number;
}

Но в зависимости от вашего варианта использования вам может не потребоваться определение ExampleProps. Вот ваша sum функция без произвольного input имени объекта:

const sum = ({
  arg1,
  arg2,
  arg3
}: {
  arg1: number;
  arg2: number;
  arg3: number;
}) => arg1 + arg2 + arg3;
0
ответ дан XDgg 27 February 2019 в 04:45
поделиться

Вот полностью аннотированный пример в виде выражения функции:

const sum: ({ 
  arg1, 
  arg2,
  arg3 
}: {
  arg1: number;
  arg2: number;
  arg3: number;
}) => number = ({ arg1, arg2, arg3 }) => arg1 + arg2 + arg3;

Вот еще одна и лучшая альтернатива для функций со стрелками. Аннотируются только аргументы, и компилятор может правильно определить тип возвращаемого значения. Функция имеет меньше помех и работает так же, как и раньше.

const sum = ({ 
  arg1,
  arg2,
  arg3
}: {
  arg1: number;
  arg2: number;
  arg3: number;
}) => arg1 + arg2 + arg3;

Если вы собираетесь аннотировать свою функцию в отдельном файле:

interface Args {
  arg1: number;
  arg2: number;
  arg3: number;
}

type Sum = (input: Args) => number;
const sum: Sum = ({ arg1, arg2, arg3 }) => arg1 + arg2 + arg3;

Вы можете использовать any в качестве типа аргумента, если типы аргументов неизвестны. Тип возвращаемого значения будет выводиться как любой:

const sum = ({ 
  arg1,
  arg2,
  arg3
}: any) => arg1 + arg2 + arg3;

Так что этот эквивалент эквивалентен предыдущему примеру:

const sum: ({ arg1, arg2, arg3 }: any) => any

Это может не иметь особого смысла для функций стрелок, но вы можете устанавливать типы для известных аргументов и использования пар ключ-значение для аннотирования дополнительных аргументов:

const sum = ({ 
  arg1,
  arg2,
  arg3
}: {
  arg1: number;
  arg2: number;
  arg3: number;
  [key: string]: number;
}) => arg1 + arg2 + arg3;

Вы также можете использовать обобщения:

interface Args {
  arg1: number;
  arg2: number;
  arg3: number;
}

const sum = <T extends Args>({ 
  arg1,
  arg2,
  arg3
}: T) => arg1 + arg2 + arg3;

Вот те же примеры, сумма как оператор функции. [1117 ]

function sum({
  arg1,
  arg2,
  arg3
}: {
  arg1: number;
  arg2: number;
  arg3: number;
}): number {
  return arg1 + arg2 + arg3;
}

Если у вас есть сложные детали реализации в теле вашей функции, оператор функции может быть лучшим выбором для ее эргономики. Плюс дженерики выглядят менее неуклюже в выражениях функций.

0
ответ дан SnnSnn 27 February 2019 в 04:45
поделиться

Не пробовал TypeScript. В JavaScript также следует рассмотреть возможность включения значений по умолчанию для свойств объекта, чтобы избежать ошибки

Uncaught TypeError: Cannot destructure property `arg1` of 'undefined' or 'null'.

для

sum()

const sum = ({ arg1, arg2, arg3 }) => 
  arg1 + arg2 + arg3;

try {
  console.log(sum())
} catch (e) {
  console.error(e)
}
[ 115]

, чего можно избежать, установив для каждого значения значение 0, где ожидаемые параметры и возвращаемое значение - это целое число JavaScript

[ 117]

const sum = ({ arg1 = 0, arg2 = 0, arg3 = 0 } = {}) => 
  arg1 + arg2 + arg3;

try {
  console.log(sum()) // 0
} catch (e) {
  console.error(e)
}

0
ответ дан guest271314 27 February 2019 в 04:45
поделиться

Если вам нужно явно аннотировать тип функции, вы можете использовать:

type Foo = (object: { arg1: number, arg2: number; arg3: number }) => number;

const bar: Foo = ({arg1, arg2, arg3}) =>  arg1 + arg2 + arg3 

Чтобы поиграть с аннотациями типов и поделиться результатами, я советую TypeScript Playground < = отметьте здесь выше :)

0
ответ дан Archie 27 February 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: