typescript - 是否可以在苗条的每个块内进行类型转换
问题描述
我有这些类型:
type Exercise = {
type: string
prompt: string
answer: string
}
type ComplexExercise = {
type: string
prompt: string,
subExercises: Exercise[]
}
我试图制作一个从 api 获取数据并根据类型呈现它的组件
<script lang="ts">
let promise = getExercise(params.exerciseId).then((ex) => (exercise = ex));
let exercise: ComplexExercise | Exercise;
</script>
...
{#await promise}
<p>Loading exercise</p>
{:then}
{#if exercise.type !== "COMPLEX"}
<BaseEditor {exercise} />
{:else}
{#each exercise.subExercises as ex}
<BaseEditor {ex} />
{/each}
{/if}
{/await}
我收到以下错误
Property 'subExercises' does not exist on type Exercise
投射它会引发此错误
{#each (exercise as ComplexExercise).subExercises as ex}
^ Unexpected token svelte(parse-error)
唯一可行的是将运动类型设置为任何类型,出于显而易见的原因,我正在避免它。任何帮助表示赞赏
解决方案
更改您的类型以使用可区分的联合类型。这意味着,TS 可以确定它是哪种具体类型有一个共同的属性。在您的情况下,该属性是type
. 假设您只有这两种运动类型:
type Exercise = {
type: "SIMPLE"
prompt: string
answer: string
}
type ComplexExercise = {
type: "COMPLEX"
prompt: string,
subExercises: Exercise[]
}
如果这样做,TS 将通过{#if exercise.type !== "COMPLEX"}
else 块中的类型知道类型,ComplexExercise
并且类型错误将消失。
有关受歧视工会的更多信息:https ://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions
推荐阅读
- angular - 从 LOCALE_ID 角度设置 APP_BASE_HREF
- c# - 2 个类(1 个 VM 1 个服务)更改/访问单例类中的属性
- javascript - 表单不会提交自定义验证错误消息
- python - RuntimeError:无法使用 tex 处理字符串,因为找不到乳胶
- arrays - 如何根据其他两个单元格填充单元格?
- javascript - Redux 状态观察器返回所需状态
- c# - SSRS 自定义程序集未获得完全信任
- javascript - 为什么控制台找不到我声明的对象?
- c++ - 不要声明 C 样式的数组,而是使用 std::array<>
- android - 是否可以将apk文件转换为IPA文件?