typescript - Typescript:如果属性值来自嵌套对象,为什么我的代码无法编译?
问题描述
我为这个糟糕的标题道歉,但我没有更好的词汇来形容它。让我向您展示我的代码:
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",
}
你可以在这里玩这个。这一切都按照我期望接受的方式工作valid4
。出于某种原因,valid4
不编译,我想要它。为什么不编译,如何编译?
答案没有明确说明这一点,所以我会:这个问题没有解决方案。
解决方案
我相信答案是这样的,但也许 Jcalz 可以纠正我。
“A”的工会 | “B”实际上有 3 个可分配性。
“A”是可分配的。“B”是可分配的。和“A” | “B”是可分配的
第三种情况破坏了valid4。在价值层面,这是不可能的,但在类型层面,它的两个“条形”| 都有可能。“baz”,因此它认为......
{foo: "baz", fooTemplate: "bar as template"}
是可能的。
至于valid3,这是因为Typescript编译器可以检测到你已经硬编码了那里的值,因此即使你断言“Foo”它认为的实际类型是“bar”
推荐阅读
- c# - 调用 FirebaseAdmin 加载凭据不起作用
- java - Ant Classloader 任务和 java 13
- java - Flyway Maven 插件从外部配置文件执行 GOLS
- android-studio - 为什么我的 Android Studio 3.5 缺少设置 > 编辑器 > 代码样式?
- paypal - 如何在 Paypal SDK createOrder 中设置商品详情?
- visual-studio-code - 如何确定导致崩溃的 VS Code 扩展?
- apache-spark - 在 Databricks / Spark 中的 SQL 中为变量分配动态值
- php - 跟踪用户日志的最佳方式?
- php - PHP,SQL根据下拉选择菜单从数据库中填充信息
- python - TensorFlow SavedModel 方法远大于 h5