Ключ общего типа с использованием символа в Typescript? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь сделать что-то вроде этого:

function attachUUID<T>(o:T) {
   o[Symbol('id')]=v1();
}

Универсальный тип T - это определение класса или некоторый определенный Typescript type. Ошибка VSCode:

 [ts] Element implicitly has an 'any' type because type '{}' has no index signature

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

... или если вы хотите присвоить символ любому объекту:

 const idSym = Symbol('id');

 function attachUUID<T>(o:T) {
    type withUUID = T & { [idSym]: string };
    (o as withUUID)[idSym] = v1();
    return o as withUUID;
 }

таким образом вы можете получить безопасность типов впоследствии:

 const el = attachUUID({ a: 1 });
 console.log(el.a, el[idSym]);
0 голосов
/ 28 августа 2018

Ваш код не гарантирует, что используемое вами символьное свойство было объявлено в T. Вы можете ограничить T типом, который объявляет свойство:

const symbolId = Symbol('id');
function attachUUID<T extends { [symbolId]: string }>(o: T) {
   o[symbolId]=v1();
}

Или приведение к any:

function attachUUID<T>(o: T) {
   (<any>o)[symbolId]=v1();
}
...