Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 我如何制作“部分<;T>;`但仅适用于可为空的字段?_Typescript - Fatal编程技术网

Typescript 我如何制作“部分<;T>;`但仅适用于可为空的字段?

Typescript 我如何制作“部分<;T>;`但仅适用于可为空的字段?,typescript,Typescript,我需要一个类似映射类型的Partial,它允许我将可空字段设置为可选字段。我正在努力输入我们的ORM,它在可空字段上将未定义强制为空 我想买一种 interface User { email: string name: string | null } 使 interface User { email: string name?: string | null } 我试过了 type NullablePartial<T> = { [P in keyof T]: T[P

我需要一个类似映射类型的
Partial
,它允许我将可空字段设置为可选字段。我正在努力输入我们的ORM,它在可空字段上将未定义强制为空

我想买一种

interface User {
  email: string
  name: string | null
}
使

interface User {
  email: string
  name?: string | null
}
我试过了

type NullablePartial<T> = { [P in keyof T]: T[P] extends null ? T[P] | undefined : T[P] }
type nullableportial={[P in keyof T]:T[P]扩展null?T[P]|未定义:T[P]}
但是
extensednull
不适用于
null
和另一种类型的联合(理想情况下,我希望它能处理多个字符串)。可选字段和未定义值之间的差异很重要


我能做什么呢?

我想我不确定这与使用可选接口属性的区别

比如:

export interface foo {
   bar?: string;    // nullable
   baz: string;
   bat: boolean;
   etcd?: boolean;  // nullable
}

在您的情况下,这不起作用吗?

在TypeScript中,使类型函数只转换一些可选或非可选的属性实际上是非常烦人的,因为没有简单的方法来描述它。我所能想到的最简单的方法就是用复数加一个。只要您传入的类型没有索引签名(它会变得更复杂),这里就应该有一些功能:


在我看来很合理。。。这接近你想要的吗?祝你好运。

让我们从查找哪些属性可为空开始

type NullablePropertyOf<T> = {
  [K in keyof T]: null extends T[K]
    ? K
    : never
}[keyof T]
我们的最终产品是通过将整个
T
的弱部分版本与假定不受影响的属性合并而创建的

type NullablePartial<T> = Partial<T> & Omit<T, NullablePropertyOf<T>>;
type nullableportial=Partial&省略;

当然,有不止一种方法可以做到这一点。在这个例子中,我选择了所有的东西,并要求所需的东西。您可以采取相反的方法:首先选择不可为null的字段,然后对可为null的字段进行选项化,然后合并这两种类型。任何适合你的。

尝试
null扩展T[p]?
而不是
T[p]扩展null?
,因为你问
null
是否可分配给
T[p]
string | null
“yes”代表
string
),而不是
T[p]
是否可分配给
null
(除非
T[p],否则这只是“否”)
null
从不
)当然,这不会使新的
用户
具有可选属性,只会将
|未定义的
添加到值类型中。真正的答案会有点复杂。在离开数据库的过程中,这些值实际上是空的。来自这些值的错误消息太疯狂了!但它是有效的!非常感谢你!什么错误消息?在我的环境中看不到任何
type NullablePropertyOf<T> = {
  [K in keyof T]: null extends T[K]
    ? K
    : never
}[keyof T]
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type NullablePartial<T> = Partial<T> & Omit<T, NullablePropertyOf<T>>;