使用打字稿中的符号来键入通用类型?

时间:2018-08-28 18:11:42

标签: javascript typescript metaprogramming symbols

我正在尝试做这样的事情:

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 :(得分:2)

您的代码不保证您使用的符号命名属性已在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();
}

答案 1 :(得分:1)

...或者如果您要将符号分配给任何对象:

 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]);