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

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

const mapLikeGet = (obj, key) => {
    if (Object.prototype.hasOwnProperty.call(obj, key))
        return obj[key]
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
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

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