Typescript пытается сделать вывод с помощью обобщений для объектов - PullRequest
0 голосов
/ 26 сентября 2018

Это то, что я пытаюсь выполнить, но для объекта с генериками. Есть ли значение `valueof`, аналогичное` keyof` в TypeScript? .

// Something on this lines. I know this is not supported but i am trying to convey the idea here.

type payload<T> = <K extends keyof T>{prop: K, value: T[K]};

const someObj = {a: string, b: number};

type someObjType = payload<someObj>;

const someObjPayload: someObjType = { prop: 'a', value: 'some string'} // should work.

const someObjPayload: someObjType = { prop: 'a', value: 200 } // should throw an error.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

К сожалению, машинопись не допускает частичного вывода переменных.Если вы хотите убедиться, что значение того же типа, что и свойство, указанное в key, вам потребуется o использовать вспомогательную функцию для получения соответствующего поведения логического вывода:

type payload<T, K extends keyof T> = {prop: K, value: T[K]};

let someObj!: {a: string, b: number};

function getProp<K extends keyof typeof someObj>(o: payload<typeof someObj, K>) {
  return o
}

const someObjPayload = getProp({ prop: 'a', value: 'some string'}) // ok of type payload<{ a: string; b: number; }, "a">

const someObjPayload2= getProp({prop: 'a', value: 100}) // error
0 голосов
/ 26 сентября 2018

Поскольку в TypeScript допускаются только number и string, может быть проще просто написать все два раза - оставив параметр типа K out

type stringKeyPayload<T> = {prop: string, value: T}
type numberKeyPayload<T> = {prop: number, value: T}
...