在一个仅仅是一个对象的数据结构中,键是字符串,值可以是另一个对象或false ({}或false),迭代数据结构的值并检查它是否是一个对象,然后修改嵌套的数据结构,它仍然是错误的,因为它可能是布尔- Property 'X' does not exist on type 'boolean | Y'.例子如下:
type Definition = {
[key: string]: string;
};
type Dictionary = {
[word: string]: Definition | boolean;
};
function checkWorkds(words: Dictionary) {
for (let [key, val] of Object.entries(words)) {
if (val !== false) {
val['etymology'] = "idk"; // <--- Error here :sob:
}
}
}
const dict: Dictionary = {
hello: {
name: "hello",
language: "english"
},
bob: false,
hola: {
name: "hola",
language: "spanish"
}
};
checkWorkds(dict);上面的例子中的确切错误是
Property 'etymology' does not exist on type 'true | Definition'.
Property 'etymology' does not exist on type 'true'.看起来if (typeof val !== 'boolean') {似乎有效,但是我很好奇是否有一种替代的/正确的方法,因为这是一个简单的例子,在生产代码中,我们有很多嵌套的值,这些值可以是其他对象,也可以是false。
发布于 2021-08-26 02:55:37
boolean类型有true和false。检查val !== false是否是不够的;只有false被删除,所以仍然存在Definition | true。你需要..。
如果只使用此布尔值,则(1)将Dictionary类型调整为只有false值
type Dictionary = {
[word: string]: Definition | false;
};或者(2)检查val !== false && val !== true或typeof val !== 'boolean',以便在联合中不再存在boolean的可能性。
发布于 2021-08-26 02:44:32
function checkWorkds(words: Dictionary) {
for (let [key, val] of Object.entries(words)) {
if (typeof val !== 'boolean') {
val['etymology'] = "idk"; // <--- no more error
}
}
}而不是val !== false,您应该使用typeof对type进行比较,这样typesript就可以确定在if子句中与boolean无关。
发布于 2021-08-26 03:06:55
为了检查您想要的确切类型,请使用相等的运算符,这样以后如果您向Dictionary 添加更多类型,就不会有任何问题。
function checkWorkds(words: Dictionary) {
for (let [key, val] of Object.entries(words)) {
if (typeof val === 'object') { // <--- Instead of typeof val !== 'boolean'
val['etymology'] = "idk";
}
}
}Ex:检查类型如果!==将出现类型错误,如果将string添加到联合:
type Dictionary = {
[word: string]: Definition | boolean | string;
};

https://stackoverflow.com/questions/68931782
复制相似问题