我当前正在编写一个辅助函数,该函数将一个Symbol添加到一个值。
function setSymbol<S extends symbol, T>(symbol: S, on: T, withValue: any = true): S & T { /*...*/ }
我的问题是,我试图解释TypeScript该函数的结果是一个具有符号属性的值,所以我可以这样做:
const MySymbol = Symbol();
const value = {};
const resultWithSymbol = setSymbol(MySymbol, value);
resultWithSymbol[MySymbol] = true;
这可能吗?我在unique symbol
上玩了一点,但无法正常工作。感谢您的帮助!
答案 0 :(得分:3)
如果您具有任何键类型K
,并且想要表示具有该键和值类型V
的对象,则可以使用内置的Record<K, V>
utility type,如下所示:< / p>
function setSymbol<S extends symbol, T>(
symbol: S,
on: T,
withValue: any = true
): Record<S, any> & T {
return null! // impl here
}
(您应该从用例中确定Record<S, any>
是否足够好,或者是否要withValue
进一步缩小类型)。请注意,Record<S, any>
与mapped type {[K in S]: any}
相同,如果您想使用它的话。您会看到示例代码现在可以正常工作:
const MySymbol = Symbol();
const value = {};
const resultWithSymbol = setSymbol(MySymbol, value);
resultWithSymbol[MySymbol] = true; // okay now
resultWithSymbol[Symbol("some other symbol")] = true; // error
好的,希望能有所帮助;祝你好运!