打字稿不检测回调条件 - Vue
Typescript does not detect condition in callback - Vue
在我的 Vuex 存储状态下,我有一个 foo
对象,它可能是 null
。
因此,在访问其中一个 属性(例如 id
)之前,我必须检查 this.$store.state.foo
是否不为空。
它一直运行良好,但似乎 TypeScript 没有检测到 axios 回调中的条件:
private join(): void {
if (this.$store.state.foo) { // <- condition to check that `this.$store.state.foo` is not null
this.axios.post(`/foo/${this.$tstore.state.foo.id}/join`) // <- No error here
.then((response) => {
// ... some code
this.$router.push({
name: 'bar',
params: { id: this.$tstore.state.foo.id } // <- TS error here, foo is potentially null
});
})
.catch((error: AxiosError) => {
// ... some code
});
}
}
我显然可以再次检查 this.$store.state.foo
是否在回调中不为空,但它有办法告诉 TypeScript 检测上范围条件吗?
您需要捕获您的变量 - TS 假定 foo
的值在回调运行时可能已变为未定义。
检查一个更简单的例子:
class X {
foo: string | undefined;
print = (x: string) => console.log(x);
private join(): void {
if (this.foo) {
setTimeout(() => {
this.print(this.foo); // ERROR
}, 1000);
}
}
private joinWithCapture(): void {
const fooCapture = this.foo;
if (fooCapture) {
setTimeout(() => {
this.print(fooCapture); // OK
}, 1000);
}
}
}
在我的 Vuex 存储状态下,我有一个 foo
对象,它可能是 null
。
因此,在访问其中一个 属性(例如 id
)之前,我必须检查 this.$store.state.foo
是否不为空。
它一直运行良好,但似乎 TypeScript 没有检测到 axios 回调中的条件:
private join(): void {
if (this.$store.state.foo) { // <- condition to check that `this.$store.state.foo` is not null
this.axios.post(`/foo/${this.$tstore.state.foo.id}/join`) // <- No error here
.then((response) => {
// ... some code
this.$router.push({
name: 'bar',
params: { id: this.$tstore.state.foo.id } // <- TS error here, foo is potentially null
});
})
.catch((error: AxiosError) => {
// ... some code
});
}
}
我显然可以再次检查 this.$store.state.foo
是否在回调中不为空,但它有办法告诉 TypeScript 检测上范围条件吗?
您需要捕获您的变量 - TS 假定 foo
的值在回调运行时可能已变为未定义。
检查一个更简单的例子:
class X {
foo: string | undefined;
print = (x: string) => console.log(x);
private join(): void {
if (this.foo) {
setTimeout(() => {
this.print(this.foo); // ERROR
}, 1000);
}
}
private joinWithCapture(): void {
const fooCapture = this.foo;
if (fooCapture) {
setTimeout(() => {
this.print(fooCapture); // OK
}, 1000);
}
}
}