gpt4 book ai didi

typescript - 为什么 typescript 未定义类型的行为与可选类型不同?

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

假设我们有界面

interface Foo {
bar: number | undefined;
}

如果我们尝试像这样创建 Foo 类型的对象

const foo: Foo = {};

它不会编译,因为缺少属性栏。但是我们说它可以是未定义的,如果我们明确地将它设置为未定义,这将起作用,但如果我们根本不设置它,那是完全一样的。它不应该和下面的完全一样吗?

interface Foo {
bar?: number;
}

对我来说这是一个问题,因为如果我们考虑更复杂的例子,我们有一个字段的接口(interface),它可以是可选的泛型类型。就像,如果没有指定泛型,那么字段应该是未定义的,如果指定了,那么它应该只是那个类型。例如

interface Foo<T = undefined> {
bar: T;
title: string;
}

const foo1: Foo = {
title: 'TITLE'
};

const foo2: Foo<number> = {
title: 'title',
bar: 12
};

foo1 将无法编译,因为缺少属性,但它无论如何都必须是未定义的,如果我们明确指定它,它就会工作,但这是完全相同的。我最终通过继承解决了这个问题,其中基类没有任何通用参数并且子类严格指定了它。但是我很好奇是否有人知道以这种方式处理未定义类型的具体原因。因为我自己找不到任何关于它的信息。

最佳答案

这两个类型签名并不完全等同(尽管它们非常接近,乍一看可能看不出区别)!

  • bar?: number 表示对象可能没有名为bar的字段。
  • 栏:数字 | undefined 表示该对象将始终有一个名为 bar 的字段,但该字段的值可能设置undefined

这种差异在某些情况下可能很重要,因为某些运行时行为取决于存在的字段和设置为未定义的字段之间的差异 - 考虑您是否在对象上调用了 Object.keys :

Object.keys({ bar: undefined }) // returns ["bar"]
Object.keys({}) // returns []

关于typescript - 为什么 typescript 未定义类型的行为与可选类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50490773/

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