对于下面的示例,为什么类型转换在 Flowtypes 中不起作用?理想的做法应该是什么?
type typeA = {
name: 'ben' | 'ken',
};
type typeB = {
name: string,
};
const objA: typeA = { name: 'ben' };
const objB: typeB = objA;
出现错误
Cannot assign `objA` to `objB` because in property `name`: Either string [1] is incompatible with string literal `ben` [2]. Or string [1] is incompatible with string literal `ken` [3].
但是,对于 typescript 来说,这很好。
最佳答案
让我们检查一下为什么您的代码不安全,Flow Try :
type typeA = {
name: 'ben' | 'ken',
};
type typeB = {
name: string,
};
const objA: typeA = { name: 'ben' };
const objB: typeB = objA // correctly catches error here because...
const mutateTypeB = (val: typeB): void => {
val.name = "len"; // ...no error is caught here
}
mutateTypeB(objB);
// now objA.name = "len"
这意味着您可以使用与 typeA
不匹配但与 typeB
匹配的 name
属性来改变 objA
>。这显然是不安全的。
您的错误可以通过两种方式解决:
- 将 name 设为
typeB
中的ReadOnly
字段 Flow Try
type typeA = {
name: 'ben' | 'ken',
};
type typeB = {
+name: string,
};
const objA: typeA = { name: 'ben' };
const objB: typeB = objA;
const mutateTypeB = (val: typeB): void => {
val.name = "len"; // error caught here instead
}
mutateTypeB(objB);
// now objA.name = "len"
- 将
string
添加为typeA
中联合的一部分 Flow Try
type typeA = {
name: 'ben' | 'ken' | string,
};
type typeB = {
name: string,
};
const objA: typeA = { name: 'ben' };
const objB: typeB = objA;
您可以阅读有关此确切问题的更多信息 here
关于javascript - 为什么流类型转换不能按预期对字符串文字起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73498389/