TypeScript:如何确定泛型类型的默认值

时间:2017-09-07 18:54:30

标签: generics types default

我想知道是否有人可以帮我解决以下问题。我实现了一个TypeScript静态扩展,用于创建具有任意数量维度的多维数组的实例(请参阅下面的代码),我可以按如下方式使用:

var mat = Array.create<number>([2, 3]);
mat[1][2] = 42; // the other 5 entries are undefined

Sofar扩展工作正常。另外,我想要实现的是,所有条目都获得一个默认值,该值取决于泛型类型参数的实际值。对于数字,它将为0,对于字符串,它将是&#34;&#34;对于布尔,它将是假的(如C#中的默认值(T),遗憾的是没有TypeScript等价物)。我做了各种尝试来实现这一目标,最后得到了代码中所示的解决方案。但不幸的是,这不起作用:所有条目仍未定义。有没有人有建议?

提前致谢 - John Pool / Amsterdam / Netherlands

interface ArrayConstructor
{
  create: <T>(dimensions: number[]) => Array<T>
}

Array.create = function <T>(dimensions: number[])
{
  let k = dimensions[0];

  if (dimensions.length == 1)
  {
    // the code fragment below does not work as I hoped & expected
    let t: T;
    var z: any;

    if (typeof t == "string")
      z = "";
    else if (typeof t == "number")
      z = 0;
    else if (typeof t == "boolean")
      z = false;
    // -----------------------------------------------------

    return (Array<T> (k)).fill (z);
  }

  let result = Array (k);

  for (var i = 0; i < k; i++)
    result [i] = Array.create (dimensions.slice (1)); // create the sub-arrays

  return result;
}

1 个答案:

答案 0 :(得分:0)

不幸的是,Generics是typescript的编译时功能,而typeof是javascript的运行时功能。你的代码不起作用的原因是因为通用在编译后消失了。

这是编译后代码的样子:

Array.create = function (dimensions) {
    var k = dimensions[0];
    if (dimensions.length == 1) {
        // the code fragment below does not work as I hoped & expected
        var t = void 0;
        var z;
        if (typeof t == "string")
            z = "";
        else if (typeof t == "number")
            z = 0;
        else if (typeof t == "boolean")
            z = false;
        // -----------------------------------------------------
        return (Array(k)).fill(z);
    }
    var result = Array(k);
    for (var i = 0; i < k; i++)
        result[i] = Array.create(dimensions.slice(1)); // create the sub-arrays
    return result;
};

请注意,t变为void 0以允许代码仍然运行。

它可能不是那么漂亮,但是你可能只想让第二个参数带有&#34;类型&#34;而不是使用泛型。枚举

enum Type {
  number,
  string,
  boolean
}

interface ArrayConstructor
{
  create: (dimensions: number[], type: Type) => Array<T>
}

然后,您可以轻松检查您希望的默认值。

或者,您可以通过另一种扩展方法将值插入到数组中来进行类型检查以查找默认值