我一直在读一本书的有效Typescript ,有一段代码我不清楚:

1.

  interface Person {
      name: string;
    }
    interface Lifespan {
      birth: Date;
      death?: Date;
    }
    
    type PersonSpan = Person & Lifespan; // why not never type ?

&运算符计算两种类型的交集.什么样的价值观属于 PersonSpan类型的?

乍一看,Person和LifeSpan界面没有 属性,因此您可能会认为它是空集(即,Never 类型).But type operations apply to the sets of values (the domain of the type), not to the properties in the interface.,并记住具有附加属性的值 仍然属于一种类型.因此,一个既具有人的属性又具有生命周期 的值 将属于交叉点类型:

const ps: PersonSpan = {
 name: 'Alan Turing',
 birth: new Date('1912/06/23'),
 death: new Date('1954/06/07'),
}; // OK
  1. 如果宣布

    输入newPersonSpan=Person|LifeSpan;//我们现在可以分配哪些值?

有人能用通俗一点的语言解释一下这件事吗

推荐答案

简而言之:要成为Person & Lifespan,对象必须具有Person中定义的所有属性,还必须具有Lifespan中定义的所有属性.

长版:这本书描述了一种你可以概念化&工作方式的方式:作为集合的交集.首先,让我们从这意味着什么开始:

interface Person {
  name: string;
}

要成为Person,变量必须是对象,并且该对象的名称属性必须是string.很简单,但有一点很重要:it can also have any number of extra properties, and still be a 100.因此,以下所有对象都与Person兼容:

{ name: 'bob' }
{ name: 'alice', age: 30 }
{ name: 'eve', birth: new Date() }

您可以将类型想象为mathematical sets,在这种情况下,Person是我刚才列出的3个对象的集合,加上与定义匹配的所有其他可能的对象.名称为字符串的所有对象,外加任意数量的任何类型的额外属性.

同样,Lifespan也可以被认为是一套.要在Lifespan集合中,对象必须具有birth属性,该属性是日期,如果它具有death属性,则该属性也必须是日期.和以前一样,允许任意数量的额外属性

生命周期 的示例包括:

{ birth: new Date(), death: new Date() }
{ birth: new Date(), name: true }
{ name: 'eve', birth: new Date() }

&运算符求出两个集合的交集.有些对象在Person中,有些在Lifespan中,有些在两者中;交集指的是两者都在的对象.

enter image description here

所以从我给出的例子来看,{ name: 'eve', birth: new Date() }是在十字路口.它既是一个人,也是一个生命周期.出于这样或那样的原因,其余的例子只出现在其中一个中,而不出现在另一个中.例如,{ name: 'bob' }不是生命周期 ,因为它没有出生,{ birth: new Date(), name: true }不是人,因为它的名字是错误的类型.

Typescript相关问答推荐

为什么在TypScript中将类型守护的返回类型写成This is(

angular 17独立使用多个组件(例如两个组件)

TypeScript将键传递给新对象错误

角形标题大小写所有单词除外

将props传递给子组件并有条件地呈现它''

使用ngrok解析Angular 时出现HTTP故障

如何使用泛型自动推断TS中的类型

部分类型化非 struct 化对象参数

在包含泛型的类型脚本中引用递归类型A<;-&B

专用路由组件不能从挂钩推断类型

如何从一个泛型类型推断多个类型

打字脚本中的模块化或命名空间

如果判断空值,则基本类型Gaurd不起作用

重写返回任何

类型脚本中参数为`T`和`t|unfined`的重载函数

将类型脚本函数返回类型提取到VSCode中的接口

我如何键入它,以便具有字符串或数字构造函数的数组可以作为字符串或数字键入s或n

从 npm 切换到 pnpm 后出现Typescript 错误

在 TypeScript 中实现类型级别深度优先搜索

是否可以从 TypeScript 的类型推断中排除this?