同时使用 "static" 和 "concrete" 泛型
Using both "static" and "concrete" generic types
所以,我想传递一个 "type" 来处理,以及一个对该类型的具体值进行操作的函数。
我希望有一种不那么冗长的方法来执行此操作,但我不确定。
我发现你可以说 typeof MyClass
来表示 "static" 类型,而 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
之间的这种区别,或者做任何其他可以让我进一步简化的事情?
据我了解,TStatic
和TConcrete
不是独立的。传递类型名称时传递的实际上是 class 的构造函数。我们可以为构造函数指定签名而不是 TStatic
这将有助于编译器更好地推断类型。
function SomeFunction<TConcrete, TKey>(
type: new (...params: any[]) => TConcrete,
keyGetter: (value: TConcrete) => TKey
): (key: TKey) => TConcrete {
// ...
}
SomeFunction(SomeType, (value) => value.SomeText); // Works fine
注意:我在最新的打字稿上测试过,我看到这个问题被标记为 1.8,它应该工作相同,但如果它适用于,请在评论中告诉我你.
所以,我想传递一个 "type" 来处理,以及一个对该类型的具体值进行操作的函数。
我希望有一种不那么冗长的方法来执行此操作,但我不确定。
我发现你可以说 typeof MyClass
来表示 "static" 类型,而 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
之间的这种区别,或者做任何其他可以让我进一步简化的事情?
据我了解,TStatic
和TConcrete
不是独立的。传递类型名称时传递的实际上是 class 的构造函数。我们可以为构造函数指定签名而不是 TStatic
这将有助于编译器更好地推断类型。
function SomeFunction<TConcrete, TKey>(
type: new (...params: any[]) => TConcrete,
keyGetter: (value: TConcrete) => TKey
): (key: TKey) => TConcrete {
// ...
}
SomeFunction(SomeType, (value) => value.SomeText); // Works fine
注意:我在最新的打字稿上测试过,我看到这个问题被标记为 1.8,它应该工作相同,但如果它适用于,请在评论中告诉我你.