元素隐式具有'any'类型,因为类型'xxx'没有索引签名.ts(7017)

时间:2019-05-16 07:45:51

标签: javascript reactjs typescript interface

TS出现问题。对于此代码分支,出现以下错误:

界面:

export default interface IUser {
  username: string;
  email?: string;
  isActive: boolean;
  group: string[];
}

名称出现的界面:

interface Field {
  name: string;
  label: string;
  placeholder: string;
  help?: string | React.ReactNode;
}

错误:

Element implicitly has an 'any' type because type 'IUser' has no index signature.ts(7017)
const user: IUser

代码:

      mode === ActionMode.EDIT_INFO && user && user[name]
        ? {
            label: user[name],
            value: user[name]
          }
        : null;

我正在阅读TS文档,其中包括: https://basarat.gitbooks.io/typescript/docs/types/index-signatures.html

这促使我相信我应该这样做:

    const defaultValue =
      mode === ActionMode.EDIT_INFO && user && user[name.toString()]
        ? {
            label: user[name.toString()],
            value: user[name.toString()]
          }
        : null;

但这没有帮助。您能解释一下这里出什么问题吗?不,我不能在这里隐含一些东西。我应该在哪里引用类型?

1 个答案:

答案 0 :(得分:1)

只有当打字稿可以证明您用来访问该对象的键是该类型的有效键时,才可以在打字稿中使用索引访问对象。这意味着index参数是作为对象键的字符串文字类型,或者对象本身具有索引签名:

索引签名定义:

 export interface IUser {
    [n: string]: string | boolean | string[] | undefined;
    username: string;
    email?: string;
    isActive: boolean;
    group: string[];
}

interface Field {
    name: string;
    label: string;
    placeholder: string;
    help?: string | React.ReactNode;
}

declare let user: IUser;
declare let field: Field;
let value = user[field.name] // ok because of the index signature

索引参数是键的并集:

export interface IUser {
    username: string;
    email?: string;
    isActive: boolean;
    group: string[];
}

interface Field {
    name: keyof IUser;
    label: string;
    placeholder: string;
    help?: string | React.ReactNode;
}

declare let user: IUser;
declare let field: Field;
let value = user[field.name] // ok because of name is a property of IUser

我建议不要使用索引签名,因为一旦添加,便可以使用 any 键访问对象(user.notHere并非索引签名错误)。

如果您已经具有类型name的{​​{1}}字段,并且由于某种原因您不能进行更改,但是可以肯定地确定它是接口的键,则可以使用类型断言:

string