【发布时间】:2017-11-29 19:33:48
【问题描述】:
所以,我想传递一个“类型”来处理,以及一个对该类型的具体值进行操作的函数。
我希望有一种不那么冗长的方法来做到这一点,但我不确定。
我发现你可以说 typeof MyClass 来表示“静态”类型,而 MyClass 是具体类型。
这是我要调用的函数的示例:
function SomeFunction<TStatic, TConcrete, TKey>(
type: TStatic,
keyGetter: (value: TConcrete) => TKey
): (key: TKey) => TConcrete
...
调用它看起来像:
Module.SomeFunction<typeof SomeType, SomeType, string>(SomeType, value => value.SomeText);
如果没有长类型列表,它无法推断该值为SomeType,但如果我明确指定它,我可以将其简化为这样并且仍然可以获得正确的类型:
Module.SomeFunction(SomeType, (value: SomeType) => value.SomeText);
当我知道我有一个Text 属性时,有一个版本的函数会更简单:
function SomeFunction2<TStatic, TConcrete extends { Text: string }>(
type: TStatic
): (key: string) => TConcrete {
return Module.SomeFunction<TStatic, TConcrete, string>(type, value => value.Text);
}
但是使用它,它无法推断出TConcrete 的类型,所以如果我希望类型正确,我最终会将此作为最简单的版本:
Module.SomeFunction2<typeof SomeType, SomeType>(SomeType);
我真正想说的是,这可能在 C# 中可以正常工作:
Module.SomeFunction(SomeType, value => value.Text);
Module.SomeFunction2(SomeType);
我能否以某种方式摆脱 TStatic 和 TConcrete 之间的这种区别,或者做任何其他可以让我进一步简化的事情?
【问题讨论】: