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

记录类型是什么?

华萧迟
2023-03-14

记录什么

类型脚本 2.1 引入了记录类型,并在一个示例中对其进行了描述:

// For every properties K of type T, transform it to U
function mapObject<K extends string, T, U>(obj: Record<K, T>, f: (x: T) => U): Record<K, U>

请参见Typescript 2.1

高级类型页面在ReadOnly部分Pick旁边的映射类型标题下提到了Records,这似乎是它的定义

type Record<K extends string, T> = {
    [P in K]: T;
}

Readonly、Partial和Pick是同态的,而Record则不是。Record不是同态的一个线索是,它不需要输入类型来复制属性:

type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>

仅此而已。除了上述引文外,没有其他提及typescriptlang.org的< code >记录

>

  • 有人能简单定义一下Record是什么吗?

    记录

    < code>K泛型是禁止对象上非< code>K的额外键,还是允许它们,只是指示它们的属性不被转换为< code>T?

    对于给定的示例:

    type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>
    

    它和这个完全一样吗

    type ThreeStringProps = {prop1: string, prop2: string, prop3: string}
    
  • 共有3个答案

    商茂勋
    2023-03-14

    现在记录类型的留档稍长:https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type

    引用如下:

    记录

    构造一个对象类型,其属性键是键,属性值是类型。该实用工具可用于将一种类型的属性映射到另一种类型。

    interface CatInfo {
      age: number;
      breed: string;
    }
     
    type CatName = "miffy" | "boris" | "mordred";
     
    const cats: Record<CatName, CatInfo> = {
      miffy: { age: 10, breed: "Persian" },
      boris: { age: 5, breed: "Maine Coon" },
      mordred: { age: 16, breed: "British Shorthair" },
    };
     
    cats.boris;
     
    const cats: Record<CatName, CatInfo>
    
    濮阳旺
    2023-03-14
    匿名用户

    记录允许您从联合创建新类型。Union中的值用作新类型的属性。

    例如,假设我有一个这样的联盟:

    type CatNames = "miffy" | "boris" | "mordred";
    

    现在我想创建一个包含所有猫信息的对象,我可以使用CatNames联合中的值作为键来创建一个新类型。

    type CatList = Record<CatNames, {age: number}>
    

    如果我想满足这个CatList,我必须创建一个这样的对象:

    const cats: CatList = {
      miffy: { age:99 },
      boris: { age:16 },
      mordred: { age:600 }
    }
    

    您可以获得非常强大的类型安全性:

      < li >如果我忘记了一只猫,就会出现错误。 < li >如果我添加了一只不允许添加的猫,我会收到一条错误消息。 < li >如果我稍后更改< code>CatNames,我会收到一个错误。这尤其有用,因为< code>CatNames可能是从另一个文件导入的,并且可能在许多地方使用。

    我最近用它创建了一个Status组件。该组件将接收状态属性,然后呈现一个图标。为了便于说明,我在这里对代码进行了大量简化

    我有一个这样的联盟:

    type Statuses = "failed" | "complete";
    

    我用它来创建一个这样的对象:

    const icons: Record<
      Statuses,
      { iconType: IconTypes; iconColor: IconColors }
    > = {
      failed: {
        iconType: "warning",
        iconColor: "red"
      },
      complete: {
        iconType: "check",
        iconColor: "green"
      };
    

    然后,我可以通过将对象中的元素解构为道具来渲染,如下所示:

    const Status = ({status}) => <Icon {...icons[status]} />
    

    如果以后扩展或更改了状态联合,我知道我的状态组件将无法编译,并且我会收到一个可以立即修复的错误。这允许我向应用添加其他错误状态。

    请注意,实际的应用具有数十个错误状态,这些状态在多个位置被引用,因此此类型安全性非常有用。

    琴修为
    2023-03-14
      < li >有人能简单定义一下什么是< code >记录吗?

    一个记录

    正如您所注意到的,K有一个目的……将属性键限制为特定值。如果您想接受所有可能的字符串值键,您可以执行记录之类的操作

    它并没有完全“禁止”额外的键:毕竟,一个值通常被允许拥有其类型中没有明确提到的属性...但是它不承认这些属性的存在:

    declare const x: Record<"a", string>;
    x.b; // error, Property 'b' does not exist on type 'Record<"a", string>'
    

    它会把它们视为多余的财产,有时会被拒绝:

    declare function acceptR(x: Record<"a", string>): void;
    acceptR({a: "hey", b: "you"}); // error, Object literal may only specify known properties
    

    有时被接受:

    const y = {a: "hey", b: "you"};
    acceptR(y); // okay
    

    对于给定的示例:

    type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>
    

    它和这个完全一样吗

    type ThreeStringProps = {prop1: string, prop2: string, prop3: string}
    

    是的!

    希望有所帮助。祝你好运!

     类似资料:
    • 本文向大家介绍区块链数据库中可用的记录类型是什么?相关面试题,主要包含被问及区块链数据库中可用的记录类型是什么?时的应答技巧和注意事项,需要的朋友参考一下 回答:区块链数据库中有两种类型的记录。他们是: 交易记录 阻止记录 无需遵循任何复杂的算法,即可轻松访问和集成这两个记录。  

    • 2、记录变量的定义 在程序中,必须先说明记录类型,然后才能定义该记录类型的变量。记录变量是把其二进制位分成一个或多个字段的字节或字变量。其定义格式与其它类型变量的定义方式类似,具体如下: [变量名] 记录名 <[字段值表]> 解释: 1、变量名即为该记录类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元; 2、字段值表是给字段赋初值,中间用逗号','分开,其字段值的排列顺序及大小应与

    • 4.4.4 记录类型的定义 1、记录类型的说明 汇编语言的记录类型与高级语言的记录类型不同,它是为按二进制位存取数据提供方便的。记录类型的说明要用到另一个保留字RECORD,其说明格式如下: 记录名 RECORD 字段 [, 字段, ……] 其中“字段”代表:字段名:宽度[=初值表达式] 解释: 1、记录名代表该记录类型; 2、记录类型可以由多个字段组成,每个字段之间要用逗号','分开; 3、字段

    • 问题内容: 什么是 称为(反对) 您知道将尖括号放在哪里吗?我经常使用它,但不知道名字-烦我。搜索非常困难-Google会忽略字符。 (注意:这是Java) 问题答案: 泛型!:)

    • 问题内容: 我在Swift范例中看到值,例如带下划线的数字。这些值默认具有什么类型? 它是否取决于我为其分配的变量的类型?它们对我来说看起来很有趣而且很新,所以我想知道,如果不按类型定义就抛出它们,该如何处理? 问题答案: 从文档(《 Swift编程语言》->《语言指南》->《基础知识》->《数字文字》): 数字文字可以包含额外的格式,以使其更易于阅读。整数和浮点数都可以用额外的零填充,并且可以包

    • 我试图建立一个具有联合数据类型支持成员记录类型的AVRO复杂记录。 我在尝试读取这种模式时出错。 我想知道-是否有可能声明这样的AVRO模式-其中一个字段类型是复杂用户定义消息结构的联合。 如果可能的话,你能让我知道我做错了什么吗?或者用union类型字段的类型定义举例说明这种结构吗? 我想使用AVRO的动态架构用法 - 因此请指定此架构文件运行时并将传入缓冲区解析为“request”/“resp