如何解决打字稿联合体类型损坏? 使用对象类型+对象文字时
https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#unions-with-common-fields
B
以示例为例
C
1示例-GOOD
2示例-GOOD
keyof (A|B) = (keyof A) & (keyof B)
3示例-GOOD
4个示例-BROKEN
直到第四个示例为止,一切都是完美的...真是令人困惑 应该为 k = {layEggs:“”} ????
证明:
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
declare function getSmallPet(): Fish | Bird;
let pet = getSmallPet();
pet.layEggs();
使用的编辑器https://www.typescriptlang.org/play(默认设置)
问题的澄清
问题是为什么在接下来的情况下允许输入
interface Birds {
flys: boolean;
layEggs: string;
}
interface Fish {
swim: number;
layEggs: string;
}
declare let k: Fish & Birds;
k = { flys:true,layEggs:"",swim:3}
不仅仅是 k = {layEggs:“”} ??
如您在 4示例-BROKEN
中所见为什么此SINTAX起作用
5示例-FIX
解决方法
似乎当我使用联合体时,关于对象文字的规则不起作用,并且当使用对象类型TS时,按预期开始抱怨。
我能说的就是TS的制作方法,我还需要学习TS中的其他数百个错误和意外行为,但总体上可能没有什么比这更好的了。
1种使用类型
```
type Birds = {
flys: boolean;
layEggs: string;
}
type Fish = {
swim: number;
layEggs: string;
}
type UnionType = Fish | Birds
//Ok to use Object Literal with Object Type
let k1: Birds= {flys:true,layEggs:"yes"}
//Ok to use Object Literal with Object Type
let k2: Fish= {swim:100,layEggs:"of course"}
//BROKEN DO NOT Object Literal with Union Type
let k3: UnionType={flys:true,layEggs:"yeah",swim:22}
//Handle union type with Function Overloading:
declare let bla: UnionType;
bla.layEggs = "yeah"
```
2使用界面
```
interface Birds {
flys: boolean;
layEggs: string;
}
interface Fish {
swim: number;
layEggs: string;
}
type UnionType = Fish | Birds
//Ok to use Object Literal with Object Type
let k1: Birds= {flys:true,swim:22}
//Handle union type with function overloading:
declare let bla: UnionType;
bla.layEggs = "yeah"
```
很难提出一个问题,谢谢@ vlaz,@ yury-tarabanko,@ jcalz,@ dane-brouwer
- typescript type is lost on an object literal assign using a union type
- TypeScript: Discriminated Unions with optional values
- 许多在线资源...
这是当前的TS功能。我不会在TS中使用对象文字,而是使用函数重载模式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。