ts写法请教,大佬hello?

1. function goCourses(type: string, obj?: Level | Genre) {
2.   if (type == "genre") {
3.         params.value.genreId = obj.genreId;
4.       } else if (type == "level") {
5.         params.value.levelId = obj.levelId;
6.       } else if (type == "all") {
7.       }
8.       router.push({ name: "courses", query: { ...params.value } });
9. }

问题1 上面的方法参数 obj?: Level | Genre 是联合类型的。
我明明用了if else 去区分,但是ts还是提示错误。这种时候怎么解决。

image.png

必须这样强制转换吗
image.png

问题2 从路由对象中结构出来的变量1 在 2和3 都已经明确加了判断,但是在4地方还是报错。
这种情况如何写?
image.png
image.png

加上方框里面的代码就可以了,每次都需要这样吗
image.png

阅读 1.2k
1 个回答

你后来补充的那个是必须的就是限制就是G类型的, 因为有两个类型, 如果obj是L类型就会报错, 所以会有提示, as后就确定了类型了
这个是类型断言:https://www.tslang.cn/docs/handbook/basic-types.html
image.png

类型断言有时候你会遇到这样的情况,你会比TypeScript更了解某个值的详细信息。 通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”。 类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 TypeScript会假设你,程序员,已经进行了必须的检查。类型断言有两种形式。 其一是“尖括号”语法:

let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;

另一个为as语法:

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

两种形式是等价的。 至于使用哪个大多数情况下是凭个人喜好;然而,当你在TypeScript里使用JSX时,只有 as语法断言是被允许的。

这些VSCOde做的静态检查, 所以进行了提示, 是说执行时有可能有这类错误
这个错误提示, 再给他加个null类型就行了
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏