Typescript强制实现可选接口成员

时间:2019-01-25 15:51:02

标签: typescript

提供界面

interface IAmOptional {
   optional? : string,
   optional2?: string
   forced: string
}

是否存在一种隐蔽,扩展或类似的IAmOptional方式,而该方式无法实现?

class someClass {
    thisShouldHaveAllKeys : IAmOptional  = { // Forced<IAmOptional> ??
        forced: 'i am forced'
    }  // Here I want an error like 'thisShouldHaveAllKeys does not have optional and optional2' 
}

2 个答案:

答案 0 :(得分:4)

是的,从TypeScript 2.8开始,有一种方法可以programmatically remove the optional modifier from properties使用-?语法和mapped types

type Required<T> = { [K in keyof T]-?: T[K] }

这会给您您想要的行为:

class someClass {
  thisShouldHaveAllKeys: Required<IAmOptional> = {  // error!
//~~~~~~~~~~~~~~~~~~~~~ <-- missing properties optional1, optional2
    forced: 'i am forced'
  }
}

实际上,这个Required类型的别名非常有用,以至于它是predefined for you in the standard library。因此,您无需定义即可使用它。

希望有帮助。祝你好运!

答案 1 :(得分:0)

您可以使用第二个界面覆盖可选成员:

unity.Resolve<IFunctionary<IOrder>[]>("Preparation")

它不是很优雅,但是可以解决问题。另一种方法是将问题颠倒过来,并使用Typescript的IFunctionary<IOrder>功能:

interface IAmOptional {
  optional? : string,
  optional2?: string
  forced: string
}

interface IAmNotOptional extends IAmOptional {
  optional: string;
  optional2: string;
}