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";
}