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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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 - Fatal编程技术网

Typescript 外部类型/嵌套属性上的用户定义类型保护?

Typescript 外部类型/嵌套属性上的用户定义类型保护?,typescript,Typescript,我有一个与之相关的问题,特别是是否可以实现一个谓词函数作为子字段的类型保护 考虑以下示例: type ContentFoo = { kind: "foo"; foo: string; } type ContentBar = { kind: "bar"; bar: string; } type Content = ContentFoo | ContentBar; 直接在content:content上定义类型保护非常有效,例如: fun

我有一个与之相关的问题,特别是是否可以实现一个谓词函数作为子字段的类型保护

考虑以下示例:

type ContentFoo = {
  kind: "foo";
  foo: string;
}

type ContentBar = {
  kind: "bar";
  bar: string;
}

type Content = ContentFoo | ContentBar;
直接在
content:content
上定义类型保护非常有效,例如:

function isFooContent(content: Content): content is ContentFoo {
  return content.kind === "foo";
}
现在想象一下,
内容
被包装成另一种类型,如:

type Entry = {
  id: string;
  content: Content;
}
我试图实现的是基于这个
条目
包装器类型定义一个类型保护。我天真的猜测是:

function isFooEntry(entry: Entry): entry.content is ContentFoo {
  return entry.content.kind === "foo";
}
但是,编译器不喜欢这种谓词函数的语法:

Cannot find namespace 'entry'.
有没有其他方法可以编写“向上一级”操作的谓词函数?或者,由于TypeScript编译器无法通过外部类型跟踪类型,这样的谓词函数在设计上是不可能的


预期用途为:

if (isFooEntry(entry)) {
  console.log("It must have a foo", entry.content.foo)
}
而不是必须写作

if (isFooContent(entry.content)) {
  console.log("It must have a foo", entry.content.foo)
}

像这样的东西应该能奏效

函数isFooEntry(entry:entry):条目为省略&{content:ContentFoo}{
return entry.content.kind==“foo”;
}

您能否提供有关如何使用此功能的更多信息<代码>isFooEntry(),我是说?很好,谢谢!现在我可以解析它:
ommit
首先从
条目
类型中“删除”属性,
&{content:ContentFoo}
将其带回来,但现在在显式
ContentFoo
类型下。有道理。@bluenote10您可以将
省略&{content:ContentFoo}
提取到
EntryFoo
类型以简化签名。
function isFooEntry(entry: Entry): entry is Omit<Entry, 'content'> & { content: ContentFoo } {
  return entry.content.kind === "foo";
}