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

// 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.
1
Amol Gupta 26 Сен 2018 в 10:50

2 ответа

Лучший ответ

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

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
1
Titian Cernicova-Dragomir 26 Сен 2018 в 08:05

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

type stringKeyPayload<T> = {prop: string, value: T}
type numberKeyPayload<T> = {prop: number, value: T}
1
Nigel Nop 26 Сен 2018 в 07:53