【发布时间】:2021-10-13 13:40:53
【问题描述】:
我想要一个通用容器类型,然后我可以在运行时对其进行专门化和检查。
type AllTypes = {
type: 'aaa' | 'bbb' | 'ccc';
value: any;
};
type A = AllTypes & { type: 'aaa' };
const all: AllTypes = {
type: 'aaa',
value: 123,
};
if (all.type == 'aaa') {
const a: A = all; // Error
}
如果我使用纯文字,它会起作用。
type AllLitTypes = 'aaa' | 'bbb' | 'ccc';
type ALit = AllLitTypes & 'aaa';
const all: AllLitTypes = 'aaa';
if (all == 'aaa') {
const a: ALit = all; // Ok
}
在我的例子中,AllTypes 的类型文字来自一个库,所以我不能先创建特定类型然后再组合它们。
【问题讨论】:
-
TypeScript 不会自动将联合从对象属性传播到整个对象;请参阅ms/TS#8289 和其他链接到它的问题。 this code 中的任何方法对您有用吗?如果是这样,我可以写一个答案;如果不是,请详细说明失败的用例。
-
感谢您将我指向 github 问题,在那里我找到了使行为易于理解的解释 link。我希望有一种不那么冗长的方式来实现预期的行为,但就这样吧。我最喜欢的是破坏(顺便说一句,使用它的好方法),我的第二个最喜欢的是简单的断言(因为我们都是负责任的程序员)
-
我看到你有自己删除的答案;我不确定你是想自己写还是想让我写我的版本。无论哪种方式对我来说都很好;让我知道。
-
不,我第一次红你评论错了。发布并获得信用
-
顺便说一句,当我应该使用“传播”时,我使用了“解构”这个词;它们是相互对立的
标签: typescript