在Typescript中指定参数类型的值

i7uaboj4  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(156)

我有这些接口:

interface IComponent {
  type: string;
  text: string;
}

interface IComponents {
  cc: IComponent;
  lajota: IComponent;
}

interface IMain {
  components: IComponents
}

而且它工作得很好!但是现在我需要添加一个新的叫做“caneta”的component
所以我用.components.caneta来访问它,但是这个新组件只有一个属性:

interface IComponentCaneta {
  property: string;
}  

// Add the new component to be used on IMain
interface IComponents {
  cc?: IComponent;
  lajota?: IComponent;
  caneta?: IComponentCaneta;
}

问题是我有一个方法,它根据属性type执行一些工作,例如:

//for each component I have in components objects 
function myFunc(component: IComponent) {
_.each(components (val, key) => {
  if (key === 'cc') {...}
  else if (value?.type === 'xxx') {  <---- HERE flags error
    components[key].type = 'xxxx'
  }
})
}

当我添加新组件caneta时,Typescript抱怨说:
类型“IComponentCaneta”上不存在属性“type”。
尝试将type设置为可选,但不起作用。
在这种情况下,什么是正确的做法?
有没有一种方法可以显式地说明“类型IComponent的属性将是'X' 'Y'或'Z'。

function myFunc(component: IComponent ['cc' or 'lajota'])

我尝试过但失败了:

// make type optional
interface IComponent {
  type?: string;
  text: string;
}

// try to infer the object (cc, loja, caneta)
switch (type) {
  case 'cc':
    // ...
    break;
  case 'lajota':
    // ...
    break;
  default: //'caneta'
    // ...
    break;
}

//using IF/ELSE 
if (type === 'cc') {.../}
else if(type === 'lajota') {...}
else if(type === 'caneta') {...}
ia2d9nvy

ia2d9nvy1#

我找到了使用Object EntriesforEach的解决方案。
我还不知道它是否有“缺点”,我只是想找到一种方法来迭代 * 组件 * 并使 typescript 满意。
我能想到的唯一解决方案是尝试推断对象,这样TS就可以“看到”正确的属性。

function myFunc (components: IComponents) {
    Object.entries(components).forEach(([key, value], index) => {
        if (key === 'caneta') {
            components[key].property = 'Hello World';
        } else if(value?.type === 'text') {  <--- No longer gives me errors
            components[key].type = 'NEW TYPE'
        }
    });
}

有一件事让我很担心,当我在Typescript Playground上尝试这段代码时,它给了我以下错误/警告:
对象可能“未定义”。
在以下行中:

components[key].property = 'Hello World';

and
components[key].type = 'NEW TYPE'

不过我的vscode/lint没有错误

相关问题