【问题标题】:How to declare TS type that is an array of object that have properties with value of type number or string?如何声明 TS 类型,它是一个对象数组,其属性的值类型为数字或字符串?
【发布时间】:2020-04-23 08:53:32
【问题描述】:

我有一个这样声明的组件的输入。

@Input() rows: (string | number)[][];

我知道这是一个字符串数组(stringnumber),我有一个数组。所以数据是一个矩阵,二维,带有字符串(浮点数,但在我的情况下,它不是)。

意识到并非每一行都有相同的元素计数,我不得不将矩阵重新加工成字典,即对象数组(其中对象具有我们一无所知的属性,除了那些只是字符串) .这是我最好的尝试。

@Input() rows: { [key: string]: (string | number) }[];

虽然计算机似乎接受它,但我担心两件事。第一个是它的语法完全错误,而且由于测试不佳,我只是不知道这个问题。第二个问题是,无论正确性如何,我都创造了一个眼睛不应该看到的残暴之谜(即有一种非常简洁的方式来表达相同的数据结构)。

如何以比建议的方式更好的方式声明上述指定的类型?

【问题讨论】:

  • 上述类型没有问题。您可以使用“快捷方式”Record<string, string | number>[],但实际上是一样的
  • @AlekseyL。虽然感谢您的反馈并了解您的来源,但我非常希望将您的建议作为已接受答案的一部分。为了将来的读者,我将把它抢走并修改为下面的一个。这样,他们可以自行决定是专用接口还是通用 TS 类型。
  • 好的,继续???

标签: typescript


【解决方案1】:

对我来说,这似乎是有效的 TypeScript。如果我是你,我会清理类型,这样我会声明一个可以在其他组件中重用的接口(如果你决定进一步传递它,可能是父级,它是输入的源,或者子级? )。

export interface Row {
  [key: string]: string | number;
}

然后,在您的组件本身中,您可以导入接口并使用它来声明输入类型。

@Input() rows: Row[];

@aleksayl 建议的另一种方法是像这样从 TS 应用默认 GP 类型。

Record<string, string | number>[]

【讨论】:

    【解决方案2】:

    您的代码非常好,不用担心。但是,将模型移动到界面中可能是个好主意,如下所示:

    interface Row {
      [key: string]: string | number;
    }
    

    附带说明:如果您的编译器/转译器将其视为有效的 Typescript,则您的语法不能是“完全错误的”——但这并不总是意味着没有更好的方法。

    【讨论】:

    • 我不同意(a)编译器接受语法必然意味着(b)没有错的说法。虽然我知道这是一个好的开始,但我仍然保持谦虚的预防措施,我可能已经引入了一种不会显示任何问题的行为,因为我(无意中)用隐藏真正 FUBAR'ness 的特殊情况来测试它。通常,事实证明这是不必要的担心,但我宁愿过分小心也不要自大地误会。
    • 你的代码可能有问题,是的,但你的语法不能错,除非编译器不接受它。在编译/编译时捕获语法错误
    • 我相信你没有抓住重点。如问题所述,这与计算机是否可以接受语法无关。那,我可以通过简单地运行程序来检查。这里的问题是关于所选语法的适当性和流畅性。显然,我真的不需要 StackOverflow 来询问语法是否有效。如果您检查其他答案,您可以看到我在询问什么样的信息。这个问题不是一个简单的“如何做”,而是一个先进的最佳实践问题。如果一个程序员因为计算机接受代码而感到满意......不是一个程序员,那么......
    • 我的意思是,如果编译器按照您所说的那样接受它,您的语法就不会是完全错误的。一旦编译器接受了您的语法,语法就没有错,只有您的语义可能是错误的,如果您想了解更多信息,这是一个很好的答案,涵盖了您对此事的困惑:stackoverflow.com/questions/17930267/…
    猜你喜欢
    • 2020-01-07
    • 2021-09-20
    • 2022-10-06
    • 2019-11-21
    • 1970-01-01
    • 2012-09-10
    • 2022-08-22
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多