Как я могу указать, что универсальный тип Typescript T [K] является числовым типом? - PullRequest
1 голос
/ 08 марта 2019

У меня есть простая функция Typescript, как это:

function getProperty<T, K extends keyof T>(obj: T, key: K): number {
  return obj[key]; // This line is not compiling.
  // Typescript will yell: "Type 'T[K]' is not assignable to type 'number'."
}

Мое использование выглядит так:

const someObj = {
  myValue: 123,
  otherProperty: '321'
}

getProperty(someObj, 'myValue')

Я не буду знать, какой будет структура someObj.

Мой вопрос: как я могу указать, что T[K] является типом числа статически?

1 Ответ

1 голос
/ 08 марта 2019

Я не буду знать, какой будет структура 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'));

на детской площадке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...