Typescript: 获取泛型类型的类型

10 浏览
0 Comments

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

存在一些解决方案适用于对象类型,但对于基本类型我无法理解。

你能给我一些帮助吗?

谢谢

0
0 Comments

问题出现的原因是,在运行时使用了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应该能够从中推断出您的类型。如果不能推断出来,您可以查看条件类型。

条件类型对我来说是关键,感谢您的解释。

0
0 Comments

问题的出现原因是因为在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中模拟获取泛型类型的功能,从而实现在运行时获取泛型类型的需求。

0