当前位置: 首页 > 知识库问答 >
问题:

Typecript将布尔值视为true|false,当StrittNullCheck关闭时

范振海
2023-03-14

我有以下typescript代码:

type PossiblePromise<T> = T extends Promise<infer U>
  ? T | U
  : T | Promise<T>;
type Z = PossiblePromise<boolean>;

const a = "a"
const f: () => Z = () => Promise.resolve(!!a);

将strictNullChecks设置为false。

生成的类型Zboolean|Promise

Type 'Promise<boolean>' is not assignable to type 'boolean | Promise<false> | Promise<true>'.
  Type 'Promise<boolean>' is not assignable to type 'Promise<false>'.
    Type 'boolean' is not assignable to type 'false'.(2322)
input.ts(7, 10): The expected type comes from the return type of this signature.

任何想法为什么typecript的行为会这样处理boolean作为true|false,这不应该是严格的NullChecks off的情况。

如何实现PossiblePromise

https://www.typescriptlang.org/play/?strictNullChecks=false


共有2个答案

司寇飞航
2023-03-14
type Z = PossiblePromise<Boolean>;
马魁
2023-03-14

您可以通过取消promise类型来修复它。问题是,布尔型是一种联合类型,条件类型自动分布在联合类型上。考虑以下代码:

type PossiblePromise<T, Y = Promise<T>> = T extends Promise<infer U>
  ? T | U
  : T | Y;
type Z = PossiblePromise<boolean>;

const a = "a"
const f: () => Z = () => Promise.resolve(!!a);

如您所见,Y是在外部条件类型下提升的,仅在需要时使用。

顺便说一句,使用布尔型并不是固定的类型定义,它只是与您的实现配合良好的不同类型(布尔型不是联合类型)-请进一步考虑布尔型。这也意味着,如果您使用任何其他联合类型,它将具有相同的错误效果,请检查下面的差异

type T = "a" | "b";
// previous result type would be:
type PreviousResult = "a" | "b" | Promise<"a"> | Promise<"b">
// after the change it will be:
type Result = "a" | "b" | Promise<"a" | "b">
 类似资料:
  • 我发现了这个语法: 这个有两个点的语法是什么:叫? 在哪里可以找到有关它的信息? 它是仅适用于布尔值还是以其他不同的方式实现?

  • 问题内容: 我正在从文件中读取一个值,我需要将其转换为布尔值。当前,即使将值设置为,它也始终将其转换为。 这是我正在尝试做的事情: 该文件基本上由带有值或写入其中的单个字符串组成。这种安排看起来很复杂,因为这是来自更大代码的最小示例,这也是我将参数读入其中的方式。 为什么总是转换为? 问题答案: 并且总是返回,因为字符串’True’和’False’不为空。 引用伟人(和Python文档): [5.

  • 我在一节课上做了这个方法。我已经仔细检查过了,应该可以正常工作了。当我使用这个方法在main方法中运行一个对象时,我总是得到一个假返回,即使它应该是真的。 print语句不打印,所以我无法检查值是否正确传递,我还尝试让if语句也返回true,但它仍然返回false!它让我头疼,因为一切在逻辑上都是正确的。 有没有一个我不知道的规则,如果出现错误,布尔方法会自动返回false? 在主要方法中:

  • 在Java8上使用Apache CXF 2.7.11实现的一些Java first SOAP服务有一个问题。当TRUE作为值传递时,值将变为null。当true以小写形式传递时,同样的方法也能很好地工作。 我看到另一个线程,其中类扩展以及解决了这个问题,但是生成的WSDL类型已经从xs:boolean更改为xs:string。这意味着使用者应将布尔值作为字符串传递。这在我的情况下是不能接受的。 J

  • 我有接收JSON对象的REST资源,该JSON对象是从用户ID到某个布尔值的映射,该布尔值指示该用户是否有错误。 由于我希望有大量的用户,所以我希望通过使用1/0而不是true/false来缩小这个JSON的大小。 我尝试了一下,发现在淡化过程中,Jackson会成功地将1/0转换成true/false,但是有没有办法告诉Jackson(也许使用注释?)将此布尔字段序列化为1/0而不是true/f

  • 我不太了解ArrayList,我想知道,ArrayList.add()是一个布尔值吗?