Я не буду знать, какой будет структура someObj
.
Тогда TypeScript не сможет вам в этом помочь.Проверка типа в TypeScript выполняется в время компиляции .Если структура someObj
будет известна только в время выполнения , TypeScript не сможет сделать доступ к этой структуре безопасным.Вам нужно знать, какие ключи свойств и возможные значения для этих свойств находятся во время компиляции.
Например: в вашем примере имена свойств являются строками, а значения свойств являются либо строками, либо числами (но не булевы или объекты и т. д.).Вы можете объявить тип, проиндексированный по строкам (поскольку все имена свойств в конечном итоге являются строками или символами, в данном случае строками), где значениями свойств являются числа или строки:
declare type SomeObjType = {
[key: string]: number | string
};
, а затем getProperty
:
function getProperty<T extends SomeObjType>(obj: T, key: string): number | string {
return obj[key];
}
и вы можете использовать его следующим образом (в данном случае я использую JSON.parse
для имитации получения этих данных вне области действия программы):
const someObj: SomeObjType = JSON.parse(`{
"myValue": 123,
"otherProperty": "321"
}`);
console.log(getProperty(someObj, 'myValue'));
console.log(getProperty(someObj, 'otherProperty'));
На игровой площадке
Но это мало что вам дает, и закрывает возможность того, что значения свойств отличаются от чисел или строк.
Возможно, вам просто нужноиспользовать object
:
function getProperty(obj: object, key: string) {
return obj[key];
}
const someObj = JSON.parse(`{
"myValue": 123,
"otherProperty": "321"
}`);
console.log(getProperty(someObj, 'myValue'));
console.log(getProperty(someObj, 'otherProperty'));
на детской площадке