【发布时间】:2021-02-09 10:03:37
【问题描述】:
如何在 Typescript 中表示任意类型的值?例如:
class Checker {
/**
* @param first a value
* @param second the type of a value
* @return true if "first" is an instance of type "second"
*/
public instanceOf(first: unknown, second: Class): boolean {
return first instanceof second;
}
}
以上代码的行为必须与first instanceof second 相同,但我不知道second 必须具有什么类型才能使其工作。
这个问题与Is there a type for "Class" in Typescript? And does "any" include it? 有关,但没有一个答案适用于具有私有构造函数的类(例如LocalDate)。我不能简单地将构造函数更改为 public,因为用户必须能够从第三方库中传递值。
什么不起作用
-
new (...args: never[]) => unknown)失败:
不能将“私有”构造函数类型分配给“公共”构造函数类型。
-
public instanceOf<T>(first: unknown, second: T)不起作用,因为它允许用户将非类型值传递给second,例如1234或"test"。请记住,如果first instanceof 1234导致编译器错误,那么instanceOf(first, 1234)也应该如此。 -
public instanceOf<T extends object>(first: unknown, second: T)阻止非类型值,但方法实现无法编译:
TS2359:“instanceof”表达式的右侧必须是“any”类型或可分配给“Function”接口类型的类型。
【问题讨论】:
-
你可以只使用泛型吗?像这样:
public instanceOf<T>(first: unknown, second: T): boolean; -
new (...args: never[]) => unknown)是表示类的方式。 provate 构造函数的全部意义在于您不能让其他任何人调用它,因此您将无法将私有构造函数获取到构造函数引用中。考虑公开 -
@TitianCernicova-Dragomir 用户需要能够传入任意类型(由第三方库定义),所以我不能简单地将构造函数更改为 public。
-
@TitianCernicova-Dragomir 使用泛型似乎破坏了实现。查看更新后的问题。
标签: typescript