首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript如何强制执行一种类型的多类型选项,类型'Y‘上不存在属性'X’

TypeScript如何强制执行一种类型的多类型选项,类型'Y‘上不存在属性'X’
EN

Stack Overflow用户
提问于 2021-08-26 02:25:29
回答 3查看 530关注 0票数 0

在一个仅仅是一个对象的数据结构中,键是字符串,值可以是另一个对象或false ({}false),迭代数据结构的值并检查它是否是一个对象,然后修改嵌套的数据结构,它仍然是错误的,因为它可能是布尔- Property 'X' does not exist on type 'boolean | Y'.例子如下:

代码语言:javascript
复制
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);

上面的例子中的确切错误是

代码语言:javascript
复制
Property 'etymology' does not exist on type 'true | Definition'.
  Property 'etymology' does not exist on type 'true'.

看起来if (typeof val !== 'boolean') {似乎有效,但是我很好奇是否有一种替代的/正确的方法,因为这是一个简单的例子,在生产代码中,我们有很多嵌套的值,这些值可以是其他对象,也可以是false

EN

回答 3

Stack Overflow用户

发布于 2021-08-26 02:55:37

boolean类型有truefalse。检查val !== false是否是不够的;只有false被删除,所以仍然存在Definition | true。你需要..。

如果只使用此布尔值,则(1)将Dictionary类型调整为只有false

代码语言:javascript
复制
type Dictionary = {
  [word: string]: Definition | false;
};

或者(2)检查val !== false && val !== truetypeof val !== 'boolean',以便在联合中不再存在boolean的可能性。

票数 1
EN

Stack Overflow用户

发布于 2021-08-26 02:44:32

代码语言:javascript
复制
function checkWorkds(words: Dictionary) {
  for (let [key, val] of Object.entries(words)) {
    if (typeof val !== 'boolean') {
      val['etymology'] = "idk"; // <--- no more error
    }
  }
}

而不是val !== false,您应该使用typeoftype进行比较,这样typesript就可以确定在if子句中与boolean无关。

Playground

票数 0
EN

Stack Overflow用户

发布于 2021-08-26 03:06:55

为了检查您想要的确切类型,请使用相等的运算符,这样以后如果您向Dictionary 添加更多类型,就不会有任何问题。

代码语言:javascript
复制
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添加到联合:

代码语言:javascript
复制
type Dictionary = {
  [word: string]: Definition | boolean | string;
};

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68931782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档