Обновление: Пожалуйста, взгляните на комментарии - этот ответ не соответствует вашему вопросу, но, возможно, он отвечает на другие вопросы пользователей, которые натолкнулись (я думаю, что из-за 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'
})
Надеемся, что это поможет будущему пользователей поисковой системы.
Как насчет:
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;
Вот полностью аннотированный пример в виде выражения функции:
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;
}
Если у вас есть сложные детали реализации в теле вашей функции, оператор функции может быть лучшим выбором для ее эргономики. Плюс дженерики выглядят менее неуклюже в выражениях функций.
Не пробовал 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)
}
, чего можно избежать, установив для каждого значения значение 0
, где ожидаемые параметры и возвращаемое значение - это целое число JavaScript
[ 117]
const sum = ({ arg1 = 0, arg2 = 0, arg3 = 0 } = {}) =>
arg1 + arg2 + arg3;
try {
console.log(sum()) // 0
} catch (e) {
console.error(e)
}
Если вам нужно явно аннотировать тип функции, вы можете использовать:
type Foo = (object: { arg1: number, arg2: number; arg3: number }) => number;
const bar: Foo = ({arg1, arg2, arg3}) => arg1 + arg2 + arg3
Чтобы поиграть с аннотациями типов и поделиться результатами, я советую TypeScript Playground < = отметьте здесь выше :)