打字稿中的动态键和值类型检查

时间:2019-04-01 14:19:20

标签: javascript typescript type-conversion

我已经开始学习打字稿。我确定可能会有与此类似的罚单,但希望对此有个快速的了解。

private void SetClickListener() {
    for (int i=0;i<arrayView.length;i++)
      if (arrayView[i] != null)
        arrayView[i].setOnClickListener(this);
}
@IBOutlet weak var segmentSection: UISegmentedControl!
segmentSection.selectedSegmentIndex = 0

但是我收到此错误i have keys type keys = 'a' | 'e' | 'i' | 'o' | 'u'; I want these to restrict the possible a keys in an object 所以我尝试了

{
numbers : number;
symbols : string;
[key : keys] : string | number | boolean;
}

但是我从TSLint获得了An index signature parameter type cannot be a union type. Consider using a mapped object type instead.。 我希望有人可以举例说明它们为什么以及如何变化,以帮助我解决这些问题。和解决方案。

我想要的结果是

{
numbers : number;
symbols : string;
[key in keys] : string | number | boolean;
}

2 个答案:

答案 0 :(得分:0)

Mapped typesindex signatures类似,但它们并不相同。如您所见,索引签名的密钥只能完全是stringnumber。映射类型允许您指定一组较窄的键,但是不能将其他属性添加到映射类型。

可以执行的操作是使用intersection

type X = {numbers: number; symbols: string} & {[K in keys]: string | number | boolean}

// type X = {
//  numbers: number;
//  symbols: string;
// } & {
//  a: string | number | boolean;
//  e: string | number | boolean;
//  i: string | number | boolean;
//  o: string | number | boolean;
//  u: string | number | boolean;
// }

这基本上与您想要的相同,因为交集A & B意味着您必须同时遵守AB

表示这种类型的另一种方法是对整个对象使用映射的conditional类型,而不是交集。对于您来说,这看起来会更复杂,但可以为人们使用提供更好的评​​价:

type Y = { [K in "numbers" | "symbols" | keys]:
  K extends "numbers" ? number :
  K extends "symbols" ? string :
  string | number | boolean };

// type Y = {
// a: string | number | boolean;
// e: string | number | boolean;
// i: string | number | boolean;
// o: string | number | boolean;
// u: string | number | boolean;
// numbers: number;
// symbols: string;

无论哪种方法都可以。希望能有所帮助;祝你好运!

答案 1 :(得分:0)


    type keys =  'a' | 'e' | 'i' | 'o' | 'u'

    type Dynamic = {
      [index in  keys]: string | number | boolean
    }&{
      numbers : number;
      symbols : string;
    }