以下代码片段通过打字稿检查
function foo(callback: (bool: boolean) => string) {
callback(true);
}
type Interface1 = {
func1: () => string;
};
const testFunction = (str: string = '') => str.toLowerCase();
const variable: Interface1 = { func1: testFunction };
// No typescript error, but will raise error on runtime
foo(variable.func1);
而以下语句会引发打字稿错误
foo(testFunction);
我们如何在编译时捕获这个错误?
问题在于你对编译器“撒谎”:
const variable: Interface1 = { func1: testFunction }; // <-- here
您基本上是在告诉编译器
testFunction
是 typeof Interface1['func1']
类型。编译器对此没有问题,因为 testFunction
(str: string = ''
) 中的参数是可选的,而 Interface1['func1']
(() => string
) 没有参数。
如果使用泛型,编译器将延迟某些类型检查,直到提供泛型类型为止。这意味着即使您“撒谎”,当时也不会执行任何检查,稍后,当检查实际发生时,就会检测到错误。
我建议使用通用类型
CallBack
而不是 bool: boolean) => string
和 () => string() => string
:
type CallBack<TArg1, TTReturn> = (arg1: TArg1) => TTReturn;
更新您的代码如下:
function foo(callback: CallBack<boolean, string>) {
callback(true);
}
type Interface1 = {
func1: CallBack<never, string>;
};
const testFunction = (str: string = '') => str.toLowerCase();
const variable: Interface1 = { func1: testFunction };
foo(variable.func1); // Error
foo(testFunction); // Error
foo((x: boolean) => '♥'); // OK