【发布时间】:2021-05-13 13:30:38
【问题描述】:
我为这个糟糕的标题道歉,但我没有更好的词汇来形容它。让我给你看我的代码:
type Foo = "bar" | "baz";
type Consistency = {
[K in Foo]: {
foo: K;
fooTemplate: `${K} in a template`;
}
}[Foo]
// I want this to compile (and it does)
const valid1: Consistency = {
foo: "bar",
fooTemplate: "bar in a template",
}
const valid2: Consistency = {
foo: "baz",
fooTemplate: "baz in a template",
}
export const anFoo: Foo = "bar"
const valid3: Consistency = {
foo: anFoo,
fooTemplate: `${anFoo} in a template` as const
}
export interface MyObj {
temporary: {
myProperty: Foo;
};
}
const state: MyObj = {
temporary: {
myProperty: "bar"
}
}
const i: Foo = state.temporary.myProperty;
const valid4: Consistency = { // Why doesn't this one compile????
foo: i,
fooTemplate: `${i} in a template` as const
}
// I don't want this to compile (and it doesn't)
const invalid1: Consistency = {
foo: "bar",
fooTemplate: "baz in a template",
}
const invalid2: Consistency = {
foo: "baz",
fooTemplate: "bar in a template",
}
You can play with this here. 这一切都按照我期望valid4 接受的方式工作。出于某种原因,valid4 无法编译,我想要它。为什么不编译,如何编译?
答案没有明确说明,所以我会:这个问题没有解决方案。
【问题讨论】:
-
我之前看到过这个错误,工会不能分配给自己,因为工会不能分配给任何一个成员。我敢打赌@jcalz 会比我更好地解释它。你有
i,作为作者的你知道这两个地方都是一样的i,但TS 只是将i视为Foo类型。如果一个Foo是"bar"而另一个Foo是"baz",则可以在两个地方都有一个Foo类型并且不能分配给Consistency。所以Foo类型不能保证可分配性。 -
这与嵌套对象无关,只是
anFoo被键入为"bar"而不是Foo。declare const anFoo: Foo也不起作用。
标签: typescript types typescript-typings