Как TypeScript реагировать на функцию получения, похожую на карту?

Я новичок в TS и изо всех сил пытаюсь ввести следующую функцию стрелки:

const mapLikeGet = (obj, key) => {
    if (Object.prototype.hasOwnProperty.call(obj, key))
        return obj[key]
}
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
1
0
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете ввести его, используя дженерики и keyof:

Детская площадка

const mapLikeGet = <T,>(obj: T, key: keyof T) => {
    if (Object.prototype.hasOwnProperty.call(obj, key))
        return obj[key]
    return undefined;
}

const foo = mapLikeGet({ foo: "bar"}, "foo");
    // ^? const foo: string | undefined 
Ответ принят как подходящий

Вы можете использовать дженерики и установить, что первая переменная должна быть объектом, а вторая переменная - k объекта, и результатом будет O[key] или undefined.

const mapLikeGet = <O extends Object, K extends keyof O>(obj: O, key: K): O[K] | undefined => {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
        return obj[key];
    }
    return undefined;
}

// foo
const foo = {
    one: 1,
    two: "",
};


const oneVal = mapLikeGet(foo, "one");
// oneVal => number | undefined

В Typescript 4.9 вы можете использовать оператор in. (См.: Анонс TypeScript 4.9):

const mapLikeGet = <O extends Object, K extends keyof O>(obj: O, key: ): O[K] | undefined => {
    if (key in obj) {
        return obj[key];
    }
    return undefined;
}

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

const mapLikeGet = (obj : any, key : string) => {
    if (Object.prototype.hasOwnProperty.call(obj, key))
        return obj[key]
}

Тот факт, что вы используете Object.prototype.hasOwnProperty.call, означает, что вы даже не предполагаете, что obj наследуется от Object, поэтому я считаю это идеальным случаем для использования типа any.

Key, с другой стороны, очевидно, является строкой.

any никогда не следует использовать. unknown в данном случае предпочтительнее.
Slava Knyazev 18.11.2022 23:29

В этом вы всегда получите any в качестве возврата. В этом случае вам нужно перепроверить тип ответа из функции, и если вы хотите смешать его с is [a type], у вас могут возникнуть проблемы в будущем. Я не рекомендую использовать any в рабочем коде, только если это действительно необходимо и вы знаете, что делаете.

jtwalters 18.11.2022 23:36

Другие вопросы по теме