Typescript: 获取泛型类型的类型
Typescript: 获取泛型类型的类型
我是Typescript的新手(来自C#),我在“特殊”的泛型实现上遇到了困难。
这是我的代码:
function createValue(): TValue[] { let result = new Array (); if (typeof TValue === "string") // 错误'TValue'只是一个类型的引用,但在此处被当作值使用 { result[0] = "abc" as TValue; } else { result[0] = false as TValue; } return result; } console.log(createValue ());
我应该如何获得类型?
我已经尝试过一些不太好看的解决方案来创建一个值,但这也不像预期的那样运行。
let value : TValue = new Array(1)[0]; let type = typeof value; // undefined
存在一些解决方案适用于对象类型,但对于基本类型我无法理解。
你能给我一些帮助吗?
谢谢
问题出现的原因是,在运行时使用了TypeScript类型。TypeScript被编译为JavaScript,因此在执行时根本看不到类型"TValue"。
"typeof"运算符用于在其他地方重用类型信息,但不用于运行时。例如:
function test(arg: string): boolean; function test2(func1: typeof test): boolean;
根据您想要实现的目标,您需要给出一个指定操作的字符串参数。
function createValue(type: 'string' | 'boolean') { let result = new Array(); if (type === "string") { result[0] = "abc"; } else { result[0] = false; } return result; } console.log(createValue('boolean'));
TypeScript应该能够从中推断出您的类型。如果不能推断出来,您可以查看条件类型。
条件类型对我来说是关键,感谢您的解释。
问题的出现原因是因为在Typescript中,泛型类型在运行时是不存在的,而只存在于编译时。因此,无法直接通过泛型类型获取其具体的类型信息。
为了解决这个问题,可以使用枚举类型和条件类型来模拟获取泛型类型的解决方案。首先,定义一个枚举类型Types,包含string、boolean和number三种类型。然后,定义一个泛型函数getType,该函数接受一个泛型参数TValue,该参数必须是Types.string或Types.boolean类型。根据传入的泛型参数,函数内部使用条件类型来判断参数的具体类型,并返回对应的数组类型。如果参数是Types.string类型,那么返回一个字符串类型的数组;如果参数是Types.boolean类型,那么返回一个布尔类型的数组。
在函数内部,通过类型断言将数组类型转换为泛型参数对应的数组类型,并返回结果。
最后,通过调用getType函数并传入Types.boolean作为参数,将获取到的结果打印到控制台。
代码如下:
enum Types { string, boolean, number } function getType(t: TValue): Array { if (t === Types.string) { let arr = new Array (); arr[0] = "abcd"; return arr as Array ; } let arr = new Array (); arr[0] = false; return arr as Array ; } console.log(getType(Types.boolean));
运行以上代码,将输出一个布尔类型的数组。
通过以上解决方案,我们可以在Typescript中模拟获取泛型类型的功能,从而实现在运行时获取泛型类型的需求。