typescript 中函数参数为对象的时候怎么写

function selectStar(star: object) {
  const { id, owner, name, html_url, description, forks, watchers, language } = star
  return {
    id, name, html_url, description, forks, watchers, language,
    owner: {
      avatar_url: owner.avatar_url,
      login: owner.login,
    },
  }
}

上面这段代码 star 只定义成 object 的时候,编辑器会提示错误:

[ts] Type 'object' has no property 'id' and no string index signature.

目前我是定义成 any,不会报错,但是这样就失去了使用 typescript 的意义,想问问大家是怎么处理的。

阅读 26.8k
3 个回答

谢邀!

首先加上 any 是正确,也是没有毛病的。

只不过我们很容易将ts语言与传统的js语言在思维上很难一下子改变。ts是编译型语言,因此在类型推导上面是需要一个明确的定义(哪声是 any 类型,tsconfig.json 也允许我们配置 noImplicitAny 所有未定义类型统一使用 any 为默认类型)。

而对于:

function selectStar(star: object) {
    const { id, owner, name, html_url, description, forks, watchers, language } = star
}

只不过解构赋值,其本质相当于:

const id = star.id;

很明显 star 是一个 object 类型,但这种类型在定义中的确没有 id 属性;前面我说了 ts 是编译型语言需要有一个明确的类型定义。

因此,如果我们按 ts 的思维,应该存在一个很明确的类型定义。例如:

interface Star {
    id: number;

    owner: string;
}

function selectStar(star: Star) {}

当然,如按 js 的思维,应该是:

function selectStar(star: any) {}

当然,后面的 const 的声明也变得无意义了。

Happy coding!

function selectStar(star:{
    id:number;
    ...
}) {
    ...
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏