Я новичок в TS и изо всех сил пытаюсь ввести следующую функцию стрелки:
const mapLikeGet = (obj, key) => {
if (Object.prototype.hasOwnProperty.call(obj, key))
return obj[key]
}
Вы можете ввести его, используя дженерики и 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 в качестве возврата. В этом случае вам нужно перепроверить тип ответа из функции, и если вы хотите смешать его с is [a type], у вас могут возникнуть проблемы в будущем. Я не рекомендую использовать any в рабочем коде, только если это действительно необходимо и вы знаете, что делаете.
any
никогда не следует использовать.unknown
в данном случае предпочтительнее.