gpt4 book ai didi

Typescript 允许为未定义的参数传递非未定义的值

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:25 26 4
gpt4 key购买 nike

我在打开所有选项的情况下在 typescript playground 中尝试了以下代码。我希望 TS 编译器只允许第一个 call()有效。然而,所有四个都是。

通过将鼠标悬停在调用上,我看到它们的类型为 call<"String"|undefined> .这里发生了什么?有什么办法可以强制执行此检查吗?

interface IEndpoint<RequestType> { }
export const GetConsumer: IEndpoint<undefined> = {};
function call<RequestType>(rpc: IEndpoint<RequestType>, request: RequestType) {}

call(GetConsumer, undefined);
call(GetConsumer, null); // should not be allowed
call(GetConsumer, 1); // should not be allowed
call(GetConsumer, "String"); // should not be allowed

最佳答案

来自 typescript specification

The undefined type is a subtype of all types. This means that undefined is considered a valid value for all primitive types, object types, union types, intersection types, and type parameters.

让我们考虑 typescript 如何解决以下场景:

class Base{ b: number}
class Derived extends Base{ c: number}
let GetDerived: IEndpoint<Derived>;
call(GetConsumer, new Base());

call中的泛型参数RequestType有两种可能的类型:Derived(基于第一个参数)和Base (基于第二个参数)。 Typescript 将为两者选择通用的基类型,因此 RequestType 将为 Base

现在让我们考虑您的示例之一:

call(GetConsumer, 1);

与第一个例子类似,call中的RequestType可以是:undefined(根据第一个参数)和number(例如基于第二个参数)。由于 undefined 在所有类型的子类型中也是 number 的子类型,所以最好的公共(public)基类型是 number

如果您正在寻找不允许最后两次调用的类型,void 可以做到这一点,因为:

The only possible values for the Void type are null and undefined. The Void type is a subtype of the Any type and a supertype of the Null and Undefined types, but otherwise Void is unrelated to all other types.

export const GetConsumer: IEndpoint<void> = {

};
call(GetConsumer, undefined);//still ok
call(GetConsumer, null); // still ok
call(GetConsumer, 1); // error
call(GetConsumer, "String"); // error

关于Typescript 允许为未定义的参数传递非未定义的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49076649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com