gpt4 book ai didi

typescript - 禁止与任何人通话

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

考虑以下函数重载:

function f(key: undefined);
function f(key: string | undefined, value: object | undefined);

我想使用单个显式未定义的 f(undefined) 进行符合条件的调用,但所有其他情况都需要两个参数。上面的重载工作正常,直到我传递类型为 any 的变量 - 似乎 any 可以转换为 undefined(是的,这看起来合乎逻辑因为它是任何)。

如何禁止使用单个 any 参数进行调用?


完整 demo code :

function f(key: undefined);
function f(key: string | undefined, value: object | undefined);

function f(key: string | undefined, value?: object | undefined) {
console.log(key, value);
}

// No errors - RIGHT
f(undefined);
f("", {});
f("", undefined);
f(undefined, undefined);
f(undefined, {});

// Errors - RIGHT
f("");

// No errors - WRONG
declare var x: any;
f(x);

最佳答案

TypeScript 真的不想禁止 any从匹配类型开始,因为这是 any 的重点.您可能需要重新考虑任何依赖于拒绝 any 的代码,所以小心行事。


也就是说,您可以使用 conditional typesany 构建一个检测器然后可以用来禁止 any变量。

这是检测器:

type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N; 

类型约束0 extends 1不满意( 0 不可分配给 1 ),所以 0 extends (1 & T) 应该是不可能的要么满意,因为(1 & T)应该比 1 更窄.然而,当Tany , 它减少了 0 extends (1 & any)0 extends any ,这很满意。那是因为 any是故意的unsound并充当几乎所有其他类型的父类(super class)型和子类型。因此,IfAny<T, Y, N>检查是否 Tany .如果是,它返回 Y .如果不是,则返回 N .让我们看看它的效果:

type IsAny<T> = IfAny<T, true, false>
const yes: IsAny<any> = true;
const no: IsAny<string> = false;

回想一下我说过 any匹配几乎所有其他类型。唯一匹配 any 的类型是never :

declare const any: any;
const never: never = any; // error, any is not assignable to never

我们也需要这个事实,以便拒绝 any参数。让我们更改f()的第一个签名来自

function f(key: undefined): void;

function f<K extends IfAny<K, never, undefined>>(key: K): void;

我们制作了 key通用类型 K限制为 IfAny<K, never, undefined> .如果K不是 any , 那么该约束就是 undefined , 所以 K只能是undefined如预期的。如果K any ,则该约束变为 never , 自 any不匹配 never ,它将无法满足约束。

当我们使用上述签名时,您会看到以下行为:

f(undefined); // still works
f(""); // still error, "" is not assignable to undefined

declare var x: any;
f(x); // now error, any is not assignable to never

这就是你想要的。

Playground link to code

关于typescript - 禁止与任何人通话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49927523/

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