Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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 如何在具有指定类型的所有可选字段的流中定义泛型类型_Typescript_Flowtype - Fatal编程技术网

Typescript 如何在具有指定类型的所有可选字段的流中定义泛型类型

Typescript 如何在具有指定类型的所有可选字段的流中定义泛型类型,typescript,flowtype,Typescript,Flowtype,我们可以很容易地在typescript中定义一个泛型类型,对于传递的泛型类型,所有字段都是可选的。这种类型的查询在类型定义中非常有用,可以定义mongo查询的结果,因为我们可能不需要获取所有字段,并且可以通过可选的类型规范进行验证 可以是文档类型 const a : Document<Person> = {_id:"1",name:"abc",department:{name:"xyz"}} const a:Document={u id:“1”,name:“abc”,depart

我们可以很容易地在typescript中定义一个泛型类型,对于传递的泛型类型,所有字段都是可选的。这种类型的查询在类型定义中非常有用,可以定义mongo查询的结果,因为我们可能不需要获取所有字段,并且可以通过可选的类型规范进行验证

可以是文档类型

const a : Document<Person> = {_id:"1",name:"abc",department:{name:"xyz"}}
const a:Document={u id:“1”,name:“abc”,department:{name:“xyz”}
因此,我们可以编写如下函数

function getResult<T>(query:Query<T>) : Document<t> {
    // code here to query and get result
}
函数getResult(查询:query):文档{
//这里的代码用于查询和获取结果
}
打字脚本非常简单。所以我想在流动中也应该有办法

您可以了解将函数类型
F
应用于
T
的每个属性的方法

type Foo = {
  A: string,
  B: number,
  C: string
};

function makeOptional<T>(t: T): ?T {
  return t;
}

type PartialFoo = $ObjMap<Foo, typeof makeOptional>;

const t: PartialFoo = {
  A: 'a',
  B: null,
  C: undefined
};
类型Foo={
A:弦,
B:号码,
C:字符串
};
函数makeOptional(t:t):?t{
返回t;
}
类型PartialFoo=$ObjMap;
常数t:PartialFoo={
A:‘A’,
B:空,
C:未定义
};
但是,在这种情况下,您仍然不能跳过键,但可以将
null
undefined
添加到它们的值中。

您可以使用实用程序:

复制所提供类型的形状,但将每个字段标记为可选

类型Foo={
A:弦,
B:号码,
C:字符串
};
常数t:$Shape={
A:‘A’
};
另一种方法是“传播”类型(很抱歉,除此之外,找不到任何文档):

类型Foo={
A:弦,
B:号码,
C:字符串
};
类型Partial={…T};
常数t:部分={
A:‘A’
};

现在它是真正的局部,你可以跳过键。

谢谢你。实际上,我们正试图为查询编写一个类型规范。我们也不能为未指定的键提供null或undefined。因为我编辑了我的问题来解释我们想要什么。这在TypeScript中是可能的,直接向前Hello团队:可能吗?TL;博士-没有回答。但出于好奇,所有字段都是可选的类型有什么意义?无论如何,在使用它之前,您需要对它们进行空检查。这里唯一的限制是添加不属于
Person
类型的字段,但这是您首先需要的吗?我们的方法是,我们总是假设DB返回
mixed
,因为应用程序。无法控制数据库,因此我们永远无法100%确定数据库可能会产生什么。在我们得到一个混合的类型的结果后,我们应用一个映射器,确保到达的数据是准确的预期类型。如果不是,则触发“意外数据”处理程序。谢谢Viktor。当我们定义mongo查询并在视图上显示结果时,实际上有一个用例。我们必须在视图(ui端)上显示较少的列。因此,我们需要创建一个类型定义,它可以期望更少的列。我们可以;t使主类型中的每一列都是可选的,因为在保存文档时,必须有强制列的值。但我相信它在flow中是不可能的,因为它起源于类型脚本,并且它的许多语法与类型脚本相似。因此,在流中应该有一种我们找不到的方式,这可能是因为没有文档记录。“所以我们需要创建一个类型定义,可以期望更少的列”-所以,您尝试创建另一个类型(即PersonForView),其中所有字段都是可选的,对吗?如果是,那么我的问题仍然存在——为什么需要一个所有字段都是可选的类型?视图仍然必须对所有字段进行空检查。你需要这种类型的吗?“它起源于类型脚本”-我目前没有证据,但我怀疑Flow起源于TS-它们非常不同,它们使用完全不同的类型推理算法,并用不同的语言编写(分别是OCaml和TS)。感谢Viktor的澄清。为视图定义一个类型似乎是重复的工作,而且容易出错,因为无法验证它是否是主类型。谢谢Aleksey。我们会试试的。
{_id:"1",name:"abc",department:{name:"xyz"}}
const a : Document<Person> = {_id:"1",name:"abc",department:{name:"xyz"}}
function getResult<T>(query:Query<T>) : Document<t> {
    // code here to query and get result
}
type Foo = {
  A: string,
  B: number,
  C: string
};

function makeOptional<T>(t: T): ?T {
  return t;
}

type PartialFoo = $ObjMap<Foo, typeof makeOptional>;

const t: PartialFoo = {
  A: 'a',
  B: null,
  C: undefined
};
type Foo = {
  A: string,
  B: number,
  C: string
};

const t: $Shape<Foo> = {
  A: 'a'
};
type Foo = {
  A: string,
  B: number,
  C: string
};

type Partial<T> = { ...T };

const t: Partial<Foo> = {
  A: 'a'
};