打字稿类型排除?

时间:2017-05-24 07:45:25

标签: typescript

我知道类型联盟&类型脚本中的类型交集,但我找不到使用类型排除的语法或解决方法。有没有办法做到这一点?

type ValidIndices = string ^ '_reservedProperty'; // All strings but '_reservedProperty'
interface MyInterface {
    [property: ValidIndices]: number;
    _reservedProperty: any;
}

2 个答案:

答案 0 :(得分:1)

这不是一个完整的答案。但是如果你想为contsructor params设置排除,你可以使用这样的代码:

declare type Params<T, K extends keyof T = never, D extends keyof T = never> = (
  {[P in K]: T[P]} &
  {[P in keyof T]?: T[P]} &
  {[P in D]?: undefined }
)
...
class Control{
  prop1: number
  prop2: number
  prop3: number
  prop4: number

  constructor(params: Params<Control, 'prop1' | 'prop2', 'prop4'>){
    Object.assign(this, params)
...

你得到:

params: {
  prop1: number
  prop2: number
  prop3?: number
  prop4?: undefined
}

答案 1 :(得分:0)

如果有一组有限的字符串值是允许的,那么你可以使用字符串文字在类型中定义它们

type ValidIndices = "a" | "b" | "c" ...

但是,我不认为您正在寻找的功能现在作为类型定义的一部分存在。

您当然可以通过MyInterface实现中的代码来实现此目的,以确保不使用非法值。但你不能把它作为类型定义本身的一部分(除了你可能不想要的字符串文字)。