如何解决我可以定义一个具有可选属性的接口,但如果定义了所有属性,则必须定义所有接口吗?
interface SomeInterface {
a: string;
b?: string;
c?: string;
}
并且我想使用此接口创建两种对象 => 仅使用 { a } 属性或 { a,b,c } 属性,我想 Typescript 不允许我创建 { a,b } 或 { a,c } 对象
有可能吗?
解决方法
你想要一个 union 类型,可能是这样的:
type SomeInterface =
{ a: string,b?: never,c?: never } |
{ a: string,b: string,c: string };
请注意,这是一个 type alias and not an interface,因此名称“SomeInterface
”有点不幸。接口不能是联合,因此您必须将其作为类型别名来执行。 TypeScript 中有几个地方需要区分类型别名和接口,但大多数情况下它们是可以互换的。这最终取决于您的用例。
无论如何,这表示 SomeInterface
是同时缺少 b
和 c
属性的类型(b?: never
表示 b
是可选的但不能如果存在,则具有定义的值),或者 b
和 c
属性都存在且具有 string
值。您可以验证这是否有效:
const x: SomeInterface = { a: "okay" };
const y: SomeInterface = { a: "okay",b: "okay",c: "okay" };
const z: SomeInterface = { a: "okay",b: "oops" }; // error!
// ~ <-- Type '{ a: string; b: string; }' is not assignable to type 'SomeInterface'.
此外,编译器可以使用 control flow analysis 检查 SomeInterface
类型的值,以查看它是两个联合成员中的哪一个:
function foo(w: SomeInterface) {
if (w.b !== undefined) {
w.c.toUpperCase(); // okay,the compiler understand that c is defined here
}
}
这很整洁。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。