我有一个类型,如果我不给任何值,我想用any
将对象键定义为可选
type OptionalData<T> = T extends undefined ? { data?: any } : { data: T };
export type DataObject<T = any> = {
item?: string | null;
} & OptionalData<T>;
在我将泛型设置为something | undefined
const data: DataObject<string | undefined> = { data: true }; // WRONG!
const data2: DataObject<string | number> = { data: true }; // CORRECT
由于我的泛型还可以扩展undefined
,所以我获取的数据是可选的any
当它只能扩展undefined
或更多时,是否可以说它只是可选的any
?
Playground
您有以下类型:
type OptionalData<T> = T extends undefined ? { data?: any } : { data: T };
export type DataObject<T = any> = {
item?: string | null;
} & OptionalData<T>;
当您将变量键入为DataObject
且类型参数是类型(如string
)和undefined
的并集时,您希望Data属性被类型化为联合类型,但它却被类型化为any
:
const data: DataObject<string | undefined> = { data: ... }
// data.data should be typed as `string | undefined` however
// data.data is typed as `any`
TypeScrip的条件类型文档在这里很有用。上面写着:
其中选中的类型是裸类型参数的条件类型称为分布条件类型。在实例化过程中,分布式条件类型自动分布在联合类型之上。例如,具有类型参数A | B | C for T
的T extends U ? X : Y
的实例化被解析为(A extends U ? X : Y) | (B extends U ? X : Y) | (C extends U ? X : Y)
。
-Documentation on distributive conditional types
所以在您的情况下,它解析为
| (string extends undefined ? { data?: any } : { data: T })
| (undefined extends undefined ? { data?: any } : { data: T })
第一个条件解析为{ data: T }
,第二个条件解析为{ data?: any }
。我相信联合类型将解析为最泛型的类型,因此该类型最终是{ data?: any }
。
此处OptionalData
已更新,可按预期运行:
type OptionalData<T> = [T] extends [undefined] ? { data?: any } : { data: T };
我们只是用方括号([]
)将T
和undefined
括起来,将它们转换为元组(或者从技术上讲是一元组,因为它只有一个元素)。这是demo。
让我们再次回顾一下条件类型的文档,重点放在重要部分:
选中类型为裸类型参数的条件类型称为分布式条件类型。分布式条件类型在实例化期间自动分布在联合类型上。
当我们将这些裸体类型转换为元组时,它们不再是裸体的。因为它们不再是裸体的,它们不再被分发。
上一篇:TypeScrip不理解记录类型必须返回正确类型类型、不理解、正确、TypeScrip
下一篇:设置使用ContractNamespace属性WCF DataContract命名空间属性、空间、ContractNamespace、DataContract