在这种情况下如何理解调用签名?

时间:2021-04-12 22:24:22

标签: typescript

我是打字稿的新手,对调用签名很困惑。 在下面的代码中,有一个接口 Counter,它应该是一个函数类型,并具有一些附加属性 intervalreset
我不明白这个说法: let counter = function (start: number) {} as Counter; 变量counter是一个返回undefined的函数,那么我们这里使用了类型断言,所以函数counter有一个Counter类型? 在 Counter 接口中,该函数有一个参数开始和返回字符串,但对于 let counter= function (start: number) {} ,这个函数声明返回 undefined,但是编译器没有抛出任何错误,谁能给我解释一下?

interface Counter {
  (start: number): string;
  interval: number;
  reset(): void;
}
function getCounter(): Counter {
  let counter = function (start: number) {} as Counter;
  counter.interval = 123;
  counter.reset = function () {};
  return counter;
}
let c = getCounter();c(10);c.reset();c.interval = 5.0;

1 个答案:

答案 0 :(得分:0)

Typescript 并不完美,因为实际上很难将静态类型分层到这种动态语言上。

这里的问题是您无法在单个语句中创建一个也具有自定义属性的函数。因此,此处 as Counter 的类型转换告诉打字稿“这可能不是类型安全的,但无论如何请将此函数视为 Counter。”

这样做可以让您直接访问仅当该函数被假定为 Counter 函数时才会存在的属性。然而,这也可能掩盖其他类型错误,例如函数的返回类型错误。


总而言之,没有抛出类型错误的原因是当你使用 as 时,你告诉 typescript 你比编译器更了解,因此一些类型错误被抑制。