gpt4 book ai didi

typescript - 类型为非假,又名 truthy

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

在 TypeScript 中,有没有表示真值的类型?

我有这个方法:Object.keys(lck.lockholders).length;enqueue(k: any, obj?: any): void顺便说一句,想想 TS 有一种方法可以检查空字符串 ''。我想将其转换为:

  enqueue(k: Truthy, obj?: any): void

除非我不知道如何定义 Truthy 的类型。顺便说一下,我认为使用 TS 有一种方法可以检查空字符串 ''。

我想要这个的原因是我不希望用户传入nullundefined''等,因为散列的键。

最佳答案

我不确定您为什么需要这个,但它很有趣。老实说,简短的回答是:TypeScript 不适合这个,你最好进行运行时检查和记录你的代码,以便开发人员知道 k 参数应该是真实的。尽管如此,如果您打算强制 TypeScript 做这样的事情,请继续阅读:


注意:要使下面的工作正常,请打开 strictNullChecks 编译器选项。这是必要的,因为无法区分 TruthyTruthy |空 | undefined 会是个问题。

几乎可以定义falsy , 这就像

type Falsy = false | 0 | "" | null | undefined 

except NaN 也是假的,并且 TypeScript 没有用于 NaN 的数字文字(参见 microsoft/TypeScript#15135 )。

即使你有如上所述的 Falsy,TypeScript 中没有否定类型(参见 microsoft/TypeScript#4196 ),所以没有办法表达 Truthy 为“除 Falsy 之外的所有内容”。

您可以尝试使用 conditional typesenqueue() 中排除可能为假的参数,但这很奇怪:

type DefinitelyTruthy<T> =
false extends T ? never :
0 extends T ? never :
"" extends T ? never :
null extends T ? never :
undefined extends T ? never :
T

declare function enqueue<T extends number | string | true | object>(
k: T & DefinitelyTruthy<T>,
obj?: any
): void

declare const str: string;
enqueue(str); // error, might be falsy
enqueue("a"); // okay
enqueue(1); // okay
enqueue(0); // error
enqueue(NaN); // error
enqueue(true); // okay
enqueue(false); // error
enqueue([]); //okay
enqueue({a: "hello"}); // okay
enqueue({}); // error, interpreted as type {} which could be an empty string:
const zilch = "" as {};
enqueue(zilch); // error, see?

注意它如何不允许任何它认为可能是虚假的东西,这可能是您想要实现的。说不清。


更新

我看到您编辑了问题以阐明 k 参数实际上应该是一个 string(或者可能是一个 symbol)并且您需要排除的唯一值是空字符串 ""。在这种情况下,您可以将上面的内容简化为:

type DefinitelyNotEmptyString<T> = "" extends T ? never : T

declare function enqueue<T extends string | symbol>(
k: T & DefinitelyNotEmptyString<T>,
obj?: any
): void

enqueue(""); // error
enqueue("a"); // okay

所有这一切都很棒,但不幸的是,如果您将通用 string 传递给 enqueue() ,它会失败,有时开发人员可能需要如果他们用于 k 参数的值不是他们指定的字符串文字,则执行此操作:

declare const str: string; // comes from somewhere else
enqueue(str); // error! how do I do this?

为了解决这个问题,您可以尝试创建一个 nominal type你可以用它来向编译器识别一个值已经被检查为空,然后生成一个 user-defined type guardstring 限制为该类型:

type NotEmptyString = string & {"***NotEmptyString***": true};
function notEmptyString(x: string): x is NotEmptyString {
return x !== "";
}

现在开发人员可以这样做:

declare const str: string;
enqueue(str); // error, might be falsy
if (notEmptyString(str)) {
enqueue(str); // okay, str is NotEmptyString
}

哇!这是很多跳圈。如果您认为这是值得的,则取决于您。好的,希望有帮助。祝你好运!

关于typescript - 类型为非假,又名 truthy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51390276/

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