gpt4 book ai didi

typescript - T[keyof T] 是否像分配条件类型一样工作?

转载 作者:行者123 更新时间:2023-12-04 11:40:17 33 4
gpt4 key购买 nike

我试图从 Distributive conditional types 理解这个例子部分:

Conditional types are particularly useful when combined with mappedtypes:

type FunctionPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];

的用法索引访问在这个例子中,我不清楚运算符。
这是使用相同想法的最简单示例(据我所知):
type Foo = {
prop1: never;
prop2: never
method1: "method1";
method2: "method2";
}

type FunctionPropertyNames = Foo[keyof Foo] // "method1" | "method2"
所以,我的问题是:索引访问运算符的这种用法只是分布式条件类型的一种特殊情况吗?因为看起来结果类型是 T[K] 的所有应用程序的并集,其中 never被过滤,因为 " never is the empty union"

更新。 我将尝试更准确地表述这个问题:
TS 手册描述了映射类型和条件类型的语法是什么。
但是,我没有找到这种类型定义形式的任何描述:
type Keys = 'name1' | 'name2' | 'name3'
type Foo = Bar[Keys]
或者,更现实的:
type Foo = Bar[keyof Bar]
它看起来像是某种映射,但它也提供过滤功能,如果 Keys 包含 never .所以我的问题更多是关于 TS 类型系统的这个特性是否有任何精确的描述。

最佳答案

这是一种特殊的用法,在根据属性类型过滤对象/类的属性时非常有用。此 article它很好地解释了根据类的联合实现与否来过滤它们是多么方便(参见文章的 Refining unions with distributive conditional types 部分)。
其他用途
正如您所说,索引访问运算符的这种用法的优点有助于从联合中删除不相关的类型,但它还有其他优点,例如根据某些条件更改类型。
下面是一个例子:

type SchemaType<T> = {
[k in keyof T]: T[k] extends
| string
| number
| boolean
| Types.ObjectId
| Client
| Doer
| Mission
| Date
| Array<any>
? SchemaDefinition['']
: SchemaType<T[k]>;
};
这是一个 type我用来输入我的 Mongoose 文档。
我有一个 typescript interface定义了 User是和 document描述 mongoDb 中的文档。
我想要的是拥有 document实现与 interface 相同的层次结构.
例如,如果 User具有结构:
interface User {
id: Types.ObjectId;
profile: {
first_name: string;
}
}
我想要 document强制执行相同的并且类型安全:
const schema: SchemaType<User> = {
id: { type: Types.ObjectId },
profile: {
first_name: { type: String, default: '' },
},
};
这就是 SchemaType 的作用使用索引访问运算符。如果属性被认为是叶子类型(如 idfirst_name),那么它必须输入为 SchemaDefinition在文件中。如果它是一个对象,那么它必须像在 interface 中一样输入。 (这就是 SchemaType<T[k]> 所做的)。

关于typescript - T[keyof T] 是否像分配条件类型一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63612419/

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