Использовать тип в качестве значения - добавить свойство в массив, которое ссылается на тип - PullRequest
0 голосов
/ 06 сентября 2018

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

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 к аргументу.

1 Ответ

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

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

'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 выглядит как значение, но в конечном итоге мне просто нужно использовать его как тип. Можно ли как-то использовать для этого декоратор?

...