在typescript中,String[]和[String]有什么区别?

4

在 TypeScript 中,String[] 和 [String] 有什么区别?两者之间选择哪个更好?


1
第二个是“元组”,意味着 let a:[String] 会期望 a 是一个数组,其第一个索引是 String 类型。例如,let a:[string,number] 会期望 a 数组的第一个元素是字符串类型,第二个元素是数字类型。来源于此链接 - Jhecht
顺便说一下:“永远不要使用类型Number、String、Boolean或Object”。请参阅https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html。 - Lusito
2个回答

9

它们不是相同的!

更新:自从TypeScript 2.7以来,这个说法不再完全正确(请参见下面的补充):

  • string[]表示变量是一个字符串类型的值数组(可以是任何大小,甚至为空)。
  • [string]表示变量是一个大小大于等于1的数组,第一个条目是一个字符串
    • 自2.7版以来:size === 1
  • [type]语法可以扩展,如[type1,type2,type3,typeN],然后需要数组至少具有N个元素,并且前N个类型与指定的类型相同,而后续类型是这些类型的联合。

一些不同的示例说明了这个问题:

const testA: string[] = []; // good
const testB: [string] = []; // Error, array must have a string at position 0
const testC: [string, number] = ["a", 0]; // good
const testC1 = testC[0]; // testC1 is detected to be string
const testC2 = testC[1]; // testC2 is detected to be number

const testD: [string, number] = ["a", 0, "1"]; // good before 2.7, bad afterwards
const testD1 = testD[2]; // testD1 is detected to be string | number
const testE: [string, number] = ["a", 0, 1]; // good before 2.7, bad afterwards
const testE1 = testE[2]; // testE1 is detected to be string | number
const testF: [string, number] = ["a", 0, null]; // Error, null is not of type string|number

自 TypeScript 2.7 起,默认情况下大小是固定的。因此,如果您想让 [string] 允许多个条目,您需要以非常丑陋的方式指定:
interface MinimumStrTuple extends Array<number | string> {
    0: string;
}

1
你是对的![string] 实际上被称为元组类型。https://www.typescriptlang.org/docs/handbook/basic-types.html - Sean F

0

回到基础,什么是TypeScript? TypeScript是JavaScript的一种带类型的超集,在最终编译为JavaScript。

如果你写这样的代码,JavaScript不支持类型。

// its OK to write code like 
let str = 'sfafsa' ;
str = true ; 

但是TypeScript可以帮助您编写类型化的代码,如果您尝试分配与变量类型不匹配的值,则在编译之前会出现错误。如果您尝试使用不同的语法编写数组,TypeScript也会进行相同的编译。

它们是相同的为什么?因为TypeScript将它们编译成相同的代码。例如:

let str: String[] = ['ge', 'gege', 'egeg'];
let str2: [String] = ['ge', 'gege', 'egeg'];

将编译为

var str = ['ge', 'gege', 'egeg'];
var str2 = ['ge', 'gege', 'egeg'];

所以它们编译成相同的代码,因此使用对您来说更好的任何内容,并且我建议为您的代码库使用相同的约定。顺便说一下:我使用这个语法 let str: String[]=[];

注意:如果您使用此语法 [String] ,那么这意味着您应该有至少一个字符串数组>> 因此,在这种情况下,空数组将导致错误

感谢@Lusito注意完整回答。


如果你仔细看我的例子,你会发现我在这里的意思是这两个数组应该包含字符串,而且我不是在说空数组,我只是在说字符串,而不是其他类型。 - mostafa tourad
1
仅仅因为两者在这个特定的例子中都可以使用,并不意味着它们是相同的。你的回答可能没有涉及到其他情况,但问题是关于这两种语言结构之间的区别。因此,虽然你的回答确实可行并且可以像那样使用,但它在原始问题方面是错误的。 - Lusito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接