Typescript 如何声明TS类型,该类型是具有类型为number或string的属性的对象数组?

Typescript 如何声明TS类型,该类型是具有类型为number或string的属性的对象数组?,typescript,Typescript,我有一个组件的输入,我这样声明 @Input() rows: (string | number)[][]; 我知道这是一个strinteger数组(string或number),我有一个strinteger数组。因此,数据是一个矩阵,二维,带有strintegers(浮点数,但在我的例子中,它不是) 意识到并非每一行都有相同的元素计数,我不得不将矩阵重新整理成一个字典,即一个对象数组(其中的对象具有我们一无所知的属性,除了那些是strinteger)。这是我最好的尝试 @Input() row

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

@Input() rows: (string | number)[][];
我知道这是一个strinteger数组(
string
number
),我有一个strinteger数组。因此,数据是一个矩阵,二维,带有strintegers(浮点数,但在我的例子中,它不是)

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

@Input() rows: { [key: string]: (string | number) }[];
虽然计算机似乎接受了它,但我担心两件事。第一个原因是它的语法完全错误,我只是因为测试不好而对这个问题一无所知。第二个是,不管正确与否,我创造了一个任何人都看不到的可怕的谜(即,有一种完美的方式来表达相同的数据结构)


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

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

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

@Input() rows: Row[];
另一种方法,如@aleksayl所建议的,是应用TS中的默认GP类型,如下所示

Record<string, string | number>[]
Record[]

您的代码非常好,不用担心。但是,最好将模型移动到界面中,如:

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

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

上述类型没有问题。您可以使用“快捷方式”
Record[]
,但这才是真正的选择same@AlekseyL. 感谢您的反馈并了解您来自何方,但我更愿意将您的建议作为公认答案的一部分。为了未来读者的利益,我将把它删掉并修改为下面的一个。这样,他们可以自己决定是专用接口还是通用TS类型。当然,我不同意(a)编译器接受语法必然意味着(b)没有任何错误的说法。虽然我知道这是一个好的开始,但我还是谦虚地提醒自己,我可能引入了一种不会出现任何问题的行为,因为我(无意中)用隐藏真正FUBAR’ness的特殊情况来测试它。通常情况下,这是不必要的担心,但我宁愿过于小心,而不是自以为是地弄错了。代码可能有问题,是的,但除非编译器不接受,否则语法不会错。语法错误是在编译/传输时发现的,我相信您没有抓住要点。如问题中所述,这与语法是否被计算机接受无关。这一点,我可以通过运行程序来检查。这里的问题是关于所选语法的适当性和流畅性。显然,我真的不需要StackOverflow来询问语法是否有效。如果你检查另一个答案,你可以看到我问的是什么样的信息。这个问题不是一个简单的“如何”问题,而是一个高级的最佳实践问题。如果程序员因为计算机接受代码而感到满意。。。我的观点是,如果编译器像您所说的那样接受语法,那么您的语法就不会完全错误。一旦编译器接受了您的语法,语法就没有错,只有您的语义可能是错的,如果您想了解更多,这是一个很好的答案,可以掩盖您在这一问题上的困惑:
interface Row {
  [key: string]: string | number;
}