typescript - 在 Pick 映射类型的定义中混淆 extends 关键字
问题描述
Pick类型的定义是:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
问题:我们为什么extends
在这里使用?在这种情况下,它不是关键字的最佳名称选择吗?extends
它应该是这样的exists in
?
因为extends
关键字的名称告诉我,我们将提供的 K 个键作为第二个参数,然后我们扩展 T 的键。所以,基本上我们得到了作为第二个参数提供的 K 个键,加上 T 的所有键。总和将*Length of T* + *amount of K keys*
键作为第二个参数。这意味着为第二个参数提供的密钥数量至少与为第一个参数提供的密钥数量相同。如果我们可能有键作为 T 上不存在的第二个参数,我们如何从第一个参数中选择?
解决方案
Extends 表示在此上下文中对类型的约束。令人困惑的部分可能是围绕什么被认为是扩展什么。
考虑经典 OOP,所有派生类型也是基类型,因此实际上我们可以将更多对象分配给基类型引用而不是派生类型引用,实际上基类型引用比派生类型引用更宽松。
让我们将此逻辑应用于 Typescript 类型,并从string
字符串文字类型开始,以下关系为真:
'prop' extends string
更严格的类型扩展了更通用的版本。将相同的逻辑应用于我们得到的联合
number extends number | string
同样,限制性更强的类型被称为扩展了更通用的类型。前进到 sting 文字的联合,这种关系也将是真实的
'foo' extends 'foo' | 'bar' |'baz'
但是,由于keyof T
是所有字符串文字类型的联合,它K
必须是一个比keyof T
它所遵循的类型更严格的类型,我们应该写
K extends keyof T
这将实际上使K
字符串文字类型联合中的一种类型表示T
.
但是,我们不仅限于一个键,因为这种关系也是正确的:
'bar' | 'foo' extends 'bar' | 'foo' |'baz'
由于左侧的并集限制性更强,因此关系为真,我们可以选择多个属性使用Pick
推荐阅读
- r - 过滤任何包含 Inf 的行
- python-3.x - 我无法在 vim 中运行 python3 程序
- java - 通过 AWS Nat Gateway 的连接问题
- python - 如何通过 UDP 使用 Python 将数据从远程机器(客户端)发送到本地机器(服务器)?
- c# - .NET JWT 实现接受过期令牌
- python - 熊猫通过辅助信息获得计数
- amazon-web-services - 如何从 SAM 模板中的 Lambda 访问 DynamoDB 表?
- ssh - 运行 Ansible playbook 时 SSH 无法访问主机
- sql-server - 将 Oracle SQL 查询转换为 Azure SQL 查询
- deep-learning - 如何加载 GluonTS DeepAR 模型