Typescript 类型:是否有更好的方法在 TypeScript 中编写函数类型签名来限制以下运行时错误?

问题描述 投票:0回答:1

以下代码片段通过打字稿检查

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);

我们如何在编译时捕获这个错误?

typescript callback
1个回答
0
投票

问题在于你对编译器“撒谎”:

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
© www.soinside.com 2019 - 2024. All rights reserved.