Использовать тип как значение — добавить в массив свойство, которое ссылается на тип

Скажем, у нас есть такой массив:

const v = [
 {name: 'foo', type: 'Boolean' },
 {name: 'bar', type: 'String' },
 {name: 'baz', type: 'JSON' },
];

достаточно просто, но что, если мы хотим добавить свойство типа:

const v = [
 {name: 'foo', type: 'Boolean' },
 {name: 'bar', type: 'String' },
 { 
  name: 'baz', 
  type: 'JSON' 
  typeOverride: Array<{z:string, v: boolean}>  // does not work, of course
 }
];

но, конечно, это не работает, мы не можем использовать тип в качестве такого значения - мне интересно, есть ли способ каким-то образом добавить свойство типа к элементу массива.

Что-то вроде этого:

const addTypeProperty = <T>(v: Elem) => v;

const v = [
 {name: 'foo', type: 'Boolean' },
 {name: 'bar', type: 'String' },
 addTypeProperty<Array<{z:string, v: boolean}>>({ 
  name: 'baz', 
  type: 'JSON' 
 })
];

кто-нибудь знает, о чем я говорю? Может быть, я могу использовать декоратор?

addTypeProperty необходимо каким-то образом добавить свойство typeOverride к аргументу.


person Alexander Mills    schedule 06.09.2018    source источник


Ответы (1)


Я думаю, что это правильно, но не совсем уверен:

'use strict';

interface Elem <T = any>{
  name: string,
  type: string,
  typeOverride?: T
}

const addTypeProperty = <T>(v: Elem): Elem<T> => v;

const v : Array<Elem> = [
  {name: 'foo', type: 'Boolean' },
  {name: 'bar', type: 'String' },
  addTypeProperty<Array<{z:string, v: boolean}>>({
    name: 'baz',
    type: 'JSON'
  })
];

странно то, что typeOverride выглядит как значение, но в конечном итоге мне просто нужно использовать его как тип. Есть ли способ использовать декоратор для этого?

person Alexander Mills    schedule 06.09.2018