【发布时间】:2020-01-20 12:20:08
【问题描述】:
假设我有一个具有属性userId 的函数,userId 与其参数和返回类型之间应该有一些约束。喜欢:
interface IMyfunc<T> {
(item: T): T
userId: T
}
它的实现是这样的:
const func: IMyfunc<number> = a => a
func.userId = 1
到目前为止一切都很好,但是,我怀疑我现在只能用数字调用func,而不能用字符串或其他东西调用它,因为我必须显式绑定它的类型使用IMyfunc接口时的参数。
所以如果我需要func 来获取字符串参数,我必须声明另一个函数express 使用IMyfunc 和string 类型绑定到它的类型参数,是什么让我觉得这里的泛型类型失去了意义真正的通用。
有什么方法可以让我输入一个具有属性并采用泛型参数的函数真的是泛型的吗?
【问题讨论】:
-
您可以使用 const func:IMyfunc
= a => a 实现您所谓的“真正的泛型”,但您会失去类型安全性。 Typescript 在赋值时需要知道类型 -
@DPro 是的,所以我想知道有没有什么方法可以让这种函数真正通用而不会失去类型安全性。
-
嗯,你能看一个用例吗?假设我有一个名为
func的“真正的通用”值。我知道如果你打电话给func(3),你会得到一个number,如果你打电话给func("a"),你会得到一个string,但是func.userId的类型是什么? -
@jcalz emm,如果实现是
const func: IMyfunc<number> = a => { func.userId = a; return a }可能对您的用例有意义。每次调用func时,func.userId应该是func的参数类型。 -
您要求的是“type state”或“type mutation”,其中值的类型可以根据值被使用。 TypeScript 可以通过控制流分析来缩小某些值的类型,但目前还没有表示任意类型突变的方法。即将到来的
assertsfeature 更接近了,但仍然不会以您想要的方式“堆叠”(大概您希望func(0); const a = func.userId; func("a"); const b = func.userId推断number为a和string为b,但可能你会为b获取never。
标签: typescript generics typescript-generics