【问题标题】:Typescript interfaces - Include only declared keys [duplicate]打字稿接口 - 仅包括声明的键[重复]
【发布时间】:2022-01-18 17:57:49
【问题描述】:

对于 typescript 接口,我只想包含我在接口本身中声明的键。

我定义了一个Person接口如下:

interface Person {
    name: string
    surname: string
}

在另一个 sn-p 中,我收到如下 json:

let personFromServer = {
    name: "myName",
    surname: "mySurname",
    age: 16
}
let p : Person = personFromServer;

console.log("I wish p to have only name and surname", p)

当我记录 p 变量时,我只想拥有

{
   name: "myName"
   surname: "mySurname"
}

但我也得到了年龄字段:

{
   name: "myName"
   surname: "mySurname"
   age: 16
}

是否可以在本地完成我想要的结果,换句话说,只是包含想要的键(并忽略额外的键,导致信息溢出)?

提前谢谢你。

【问题讨论】:

  • 接口是编译时构造;它们在运行时不存在。因此,当您的代码获取该对象时,该接口早已不复存在。您可以创建一个class,它将一个对象作为构造函数参数并将其属性设置为同名对象的属性(也有库这样做)。

标签: typescript interface


【解决方案1】:

可能不是问题。如果某个属性不是类型的一部分,那么 Typescript 将不允许您访问该属性。在这种情况下,如果您尝试访问age,您将收到类型错误。

let personFromServer = {
    name: "myName",
    surname: "mySurname",
    age: 16
}
let p: Person = personFromServer;
p.age // Property 'age' does not exist on type 'Person'.(2339)

请务必记住,Typescript 是一种编译时工具,可让开发人员更快地编写更正确的代码。 Typescript 不是在运行时强制执行对象类型的方法。

编译后,上面的所有代码都会变成:

let personFromServer = {
    name: "myName",
    surname: "mySurname",
    age: 16
}
let p = personFromServer;
console.log("I wish p to have only name and surname", p)

因此,可执行代码中没有任何提示可以告诉您应该包含什么,不应该包含什么。


如果存在安全隐患,这可能很重要。例如,用户可能有一个哈希密码,该用户是从数据库中检索到的,您不希望服务器在其公共 API 上返回该密码。然后您必须在运行时手动执行此操作。

可能是这样的:

import _ from 'lodash' // use lodash's omit() for simplicity

interface Person {
    name: string
    surname: string
}

interface PersonWithAge extends Person {
  age: number
}

let personFromServer: PersonWithAge = {
    name: "myName",
    surname: "mySurname",
    age: 16
}
let p: Person =  _.omit(personFromServer, 'age')
console.log(p) // only name and surname

Playground

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2019-03-26
    • 2017-08-12
    • 2020-09-12
    • 2017-06-10
    • 2021-01-12
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多