TypeScript:用符号声明交集类型?

TypeScript: Declare Intersection Type with 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 玩了一下,但无法正常工作。感谢您的帮助!

如果您有任何键类型 K 并且想用该键和类型 V 的值表示一个对象,您可以像这样使用内置的 Record<K, V> utility type :

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

好的,希望对您有所帮助;祝你好运!

Link to code