当前位置: 首页 > 知识库问答 >
问题:

在Types criptd.ts文件中定义的覆盖接口属性类型

东郭自珍
2023-03-14

是否有方法更改在〈代码〉*中定义的接口属性的类型。d、 在typescript中?

例如:x.d.ts中的接口定义为

interface A {
  property: number;
}

我想在我写入的typescript文件中更改它

interface A {
  property: Object;
}

甚至这样也行

interface B extends A {
  property: Object;
}

这种方法有效吗?当我尝试我的系统时,它没有工作。只是想确认一下这是否可能?

共有3个答案

翁翰墨
2023-03-14

无法更改现有属性的类型。

您可以添加属性:

interface A {
    newProperty: any;
}

但改变现有的一种类型:

interface A {
    property: any;
}

导致错误:

后续变量声明必须具有相同的类型。变量“property”的类型必须为“number”,但此处的类型为“any”

您当然可以拥有自己的接口来扩展现有接口。在这种情况下,您可以仅将类型覆盖为兼容类型,例如:

interface A {
    x: string | number;
}

interface B extends A {
    x: number;
}

顺便说一句,您可能应该避免使用对象作为类型,而应该使用类型any。

任何类型的文档中,它声明:

any类型是使用现有JavaScript的一种强大方式,允许您在编译期间逐渐选择加入和退出类型检查。您可能希望Object扮演类似的角色,就像在其他语言中一样。但是Object类型的变量只允许您为其分配任何值-您不能对其调用任意方法,即使是实际存在的方法:

let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)

let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
孔鸿云
2023-03-14
 type ModifiedType = Modify<OriginalType, {
  a: number;
  b: number;
}>
 
interface ModifiedInterface extends Modify<OriginalType, {
  a: number;
  b: number;
}> {}

受ZSkycat的扩展省略解决方案的启发,我想出了这个:

type Modify<T, R> = Omit<T, keyof R> & R;

// before typescript@3.5
type Modify<T, R> = Pick<T, Exclude<keyof T, keyof R>> & R

例子:

interface OriginalInterface {
  a: string;
  b: boolean;
  c: number;
}

type ModifiedType  = Modify<OriginalInterface , {
  a: number;
  b: number;
}>

// ModifiedType = { a: number; b: number; c: number; }

循序渐进:

type R0 = Omit<OriginalType, 'a' | 'b'>        // { c: number; }
type R1 = R0 & {a: number, b: number }         // { a: number; b: number; c: number; }

type T0 = Exclude<'a' | 'b' | 'c' , 'a' | 'b'> // 'c'
type T1 = Pick<OriginalType, T0>               // { c: number; }
type T2 = T1 & {a: number, b: number }         // { a: number; b: number; c: number; }

TypeScript实用程序类型

interface Original {
  a: {
    b: string
    d: {
      e: string // <- will be changed
    }
  }
  f: number
}

interface Overrides {
  a: {
    d: {
      e: number
      f: number // <- new key
    }
  }
  b: {         // <- new key
    c: number
  }
}

type ModifiedType = ModifyDeep<Original, Overrides>
interface ModifiedInterface extends ModifyDeep<Original, Overrides> {}
// ModifiedType =
{
  a: {
    b: string
    d: {
      e: number
      f: number
    }
  }
  b: {
    c: number
  }
  f: number
}

在下面查找ModifyDeep。

应翰飞
2023-03-14

我使用一种方法,首先过滤字段,然后组合它们。

引用从类型中排除属性

interface A {
    x: string
}

export type B = Omit<A, 'x'> & { x: number };

对于界面:

interface A {
    x: string
}

interface B extends Omit<A, 'x'> {
  x: number
}
 类似资料:
  • 在spring boot中,我有以下配置文件:application-email.yaml

  • 这些是我没用的财产领域... 是hibernate覆盖了这个超时值,还是我设置得不正确?提前感谢!

  • 问题内容: 我想要的只是让bool(myInstance)返回False(以及在if / or / and等条件下让myInstance评估为False。我知道如何覆盖>,<,=) 我已经试过了: 有什么建议? (我正在使用Python 2.6) 问题答案: 这是Python 2.x还是Python 3.x?对于Python 2.x,您正在寻找替代方法。

  • 在这个特定的示例中,我扩展了

  • 问题内容: 我想组成另一种类型的类型,但用假冒替换字段之一(这是接口值)。我遇到的问题是正在使用基础字段,因此我似乎无法覆盖该字段。 我在这里演示了这个问题:https : //play.golang.org/p/lHGnyjzIS-Y 为什么打印?我要打印。 谢谢。 问题答案: 通过,您正在调用 提升的 方法,方法接收者将是哪种类型,并调用何处是哪种类型,这就是它打印的原因。 在Go中有嵌入,但

  • 问题内容: 在Swift中,有人可以解释如何用原始属性的子类覆盖另一个超类的属性吗? 举一个简单的例子: 这给出了错误: 如果我将机箱设为“ var”,则会收到错误消息: 在指南中“覆盖属性”下唯一可以找到的内容表明,我们必须覆盖getter和setter,这可能会更改属性的值(如果它是’var’),但是如何更改属性类呢? ? 问题答案: Swift不允许您更改任何变量或属性的类类型。相反,您可以