记录什么
类型脚本 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}
现在记录类型的留档稍长: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>
匿名用户
记录
允许您从联合创建新类型。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]} />
如果以后扩展或更改了状态
联合,我知道我的状态组件将无法编译,并且我会收到一个可以立即修复的错误。这允许我向应用添加其他错误状态。
请注意,实际的应用具有数十个错误状态,这些状态在多个位置被引用,因此此类型安全性非常有用。
一个记录
正如您所注意到的,
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