在这种情况下,如何理解呼叫签名



我是打字的新手,对调用签名很困惑。在下面的代码中,有一个接口Counter,它应该是一个函数类型,并具有一些额外的属性intervalreset
我不理解这句话:let counter = function (start: number) {} as Counter;变量counter是一个未定义的函数返回,然后我们在这里使用类型断言,所以函数计数器有counter类型?在Counter接口中,函数有一个参数开始和返回字符串,但对于let counter= function (start: number) {},这个函数声明返回未定义,但编译器没有抛出任何错误,有人能向我解释一下吗?

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;

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

这里的问题是,不能在一条语句中创建一个同时具有自定义属性的函数。所以这里是CCD_ 3的类型转换告诉typescript";这可能不是类型安全的,但无论如何请将此函数视为Counter">

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


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

最新更新