TypeScript:用符号声明交叉点类型?

时间:2019-12-10 13:55:39

标签: typescript typescript-typings typescript-generics

我当前正在编写一个辅助函数,该函数将一个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上玩了一点,但无法正常工作。感谢您的帮助!

1 个答案:

答案 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

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

Link to code