【发布时间】:2019-01-28 19:11:38
【问题描述】:
我有一个特殊类型定义如下:
interface HasNoName {
hasName: false;
}
interface HasName {
hasName: true;
name: string;
}
type MySpecialType = HasNoName | HasName;
有没有办法把MySpecialType写成接口?它需要是一个接口,因为我想要一个类来实现它。我不会写:
interface MySpecialType extends HasNoName, HasName {}
当我得到错误时:
“'HasName' 和 'HasNoName' 类型的命名属性 'hasName' 不是 一样的。”
【问题讨论】:
-
如果您说
HasNoName将hasName设置为false,而HasName则相反,那么当您将它们组合在一起时,您希望MySpecialType拥有什么?听起来你可能只需要一个界面,比如Nameable { hasName: boolean; name?: string; } -
基本上我想知道是否可以从联合类型创建接口。您推荐的界面可以工作,但并不完美,因为我希望对执行以下操作的人具有类型安全性:
const foo: Nameable = { hasName: true };. -
对我来说,设置
false或true是一种实现。所以我可能有 2 个像class HasNoName implements Nameable { hasName = false; } class HasName implements Nameable { hasName = true; name: string; }这样的课程。也许其他人有更好的主意! -
如果
const truethy=()=> true; const foo: Nameable = { hasName: truthy() };怎么办?你认为 TS 应该评估表达式并相应地进行类型检查吗? -
不应该是
interface HasNoName { hasName: boolean; } interface HasName { hasName: boolean; name: string; }吗?
标签: typescript class interface