打字稿中可选参数和默认参数的类型

时间:2019-01-21 16:08:37

标签: typescript

比方说,我正在制作一个函数,该函数本身可以返回唯一的参数,在javascript中将是这样的:

function returnItself(x) {
  return x;
}

我还想保持参数类型不变,并使参数可选,所以我写道:

function returnItself<T>(x?: T) {
  return x;
}

但是结果是...

var a1 = returnItself("foo");
type A1 = typeof a1; // expect A1 to be "string", but it's "string | undefined".
var a2 = returnItself();
type A2 = typeof a2; // expect A2 to be "undefined", but it's "{} | undefined".

我尝试将可选参数更改为默认值:

function returnItself<T extends any>(x: T = 0 as number) {
  return x; // if x is not given it should return number 0;
}

但是甚至出现了编译器错误:

Type 'number' is not assignable to type 'T'.

写这个的正确方法是什么?

*****编辑****

在这种情况下:

function returnItself<T>(x?: T) {
  return x;
}
var a1 = returnItself(undefined); // a1 = undefined. ok
var a2 = returnItself(); // a2 = undefined. ok
type A1 = typeof a1; // type A1 = undefined. ok
type A2 = typeof a2; // type A2 = {} | undefined. ???

如果我明确传递undefined作为参数,Typescript可以正确推断返回类型。

但是,当我只是不给出参数时,我期望与上面的参数具有相同的结果(和类型),但是它们的结果类型不相同。

我相信returnItself()returnItself(undefined)应该具有相同的行为,也许我错了?

2 个答案:

答案 0 :(得分:0)

可选表示它可以是undefinednull。所以返回的类型是正确的。

如果您不希望它为null,则只需使用

function returnItself<T>(x: T) {
  return x;
}

T也是通用类型,这意味着它可以是任何东西。您不能强行将其设置为number

答案 1 :(得分:0)

您不能将number分配给T,因为它对编译器没有意义。基本上,T是泛型类型,您在这里将其用作变量。这意味着调用此函数的用户可以在运行时说出T的类型:

const a1 = returnItself<number>(9) 

因此,当您将number分配给T时,打字稿会抱怨,因为它尚不知道T是什么。如果您想使用TypeScript中的可选值,建议您养成显式检查该值是否存在于函数主体中的习惯。以下内容将通过您的所有测试:

function returnItself<T>(x?: T) {
  if (x) return x
  else return 0 //or whatever other value you want as a default case
}