1、Ts中的元组
js中数组没有类型限制,所以数组可以装不同类型的数据,但是到了ts,为了类型安全,数组明确了类型限制,这个时候就出现了元组,元组其实编译之后便成js中的数组。
和数组的核心区别主要体现在
(1)类型的限制上:类型约束、类型安全,更好的代码提示、函数多返回值、可以存储不同类型的数据,但是类型申明时候固定。它的存在就完全是为了限制类型,尽可能类型缩小
(2)存储同质与不同质的区别
// 声明元组类型
let tuple: [string, number, boolean];
tuple = ["hello", 42, true]; // ✅ 正确
// 可选元素使用问号
let optionalTuple: [string, number?];
optionalTuple = ["hello"]; // ✅ 正确
optionalTuple = ["hello", 42]; // ✅ 正确
// 剩余元素使用展开运算符
type StringNumberBooleans = [string, number, ...boolean[]];
type StringBooleansNumber = [string, ...boolean[], number];
type BooleansStringNumber = [...boolean[], string, number];
const a: StringNumberBooleans = ["hello", 1];
const b: StringNumberBooleans = ["hello", 1, true, false, true];
// 数组解构
let [first, second] = ["hello", 42] as [string, number];
2、python中的元组
但是python的元组和数组的主要区别在于,可变不可变、存储同质不同质
| 特性 | 元组 | 列表 |
|---|---|---|
| 可变性 | 不可变 | 可变 |
| 语法 | 小括号 () |
中括号 [] |
| 性能 | 更轻量,创建和遍历更快 | 稍重,操作稍慢 |
| 用途 | 保证数据安全,用作字典键,函数多返回值 | 需要动态增删数据的场景 |
| 数据性质 | 通常是异质的 | 通常是同质的 |
| 内存 | 固定,更节省 | 动态分配,可能预留额外空间 |
注意:深浅拷贝特性copy.copy与copy.deepcopy
3、kotlin中的类似元组
Kotlin 没有像 Swift 或 Python 那样的原生元组语法。它提供了标准库中的类来模拟二元组和三元组,但对于更复杂的情况,推荐使用数据类(Data Class)。
javascript
val pair = Pair("Alice", 25) // 类型是 Pair<String, Int>
val triple = Triple("Alice", 25, "London") // 类型是 Triple<String, Int, String>
val pair2 = "Bob" to 30 // 使用中缀函数 'to' 类型是 Pair<String, Int>
局限性 :Pair 和 Triple 只能容纳 2 个和 3 个元素。对于更多元素或需要明确语义的场景,Kotlin 官方强烈推荐使用数据类(Data Class),因为它提供了清晰的命名和更好的可维护性
Kotlin
// 替代四元元组,更优的方案
data class Person(val name: String, val age: Int, val city: String, val country: String)
val person = Person("Alice", 25, "London", "UK")
4、swift中的元组
swift中的元组和ts中的高度相似,只是swift中没有可选元组以及剩余元组的概念
javascript
// TS: 可选元素
let optionalTuple: [string, number?];
optionalTuple = ["hello"]; // ✅ 第二个元素可选
optionalTuple = ["hello", 42]; // ✅ 也可以提供
Swift
//swift中
let optionalTuple: (String, Int?) = ("hello", nil) // ✅
let optionalTuple2: (String, Int?) = ("hello", 42) // ✅
ts和swift中可选值的概念不一样,ts ?可选的意思是可以没有值,但是swift中的意思是这个值可以是nil
剩余元组:
javascript
// TS: 剩余元素
type RestTuple = [string, ...number[]];
const restTuple: RestTuple = ["scores", 95, 88, 92, 78];
// 带标签的剩余元组
type NamedRest = [name: string, ...scores: number[]];
swift
Swift
// 方式1:使用数组作为元组的一个元素
let scoresTuple: (subject: String, scores: [Int]) = ("数学", [95, 88, 92, 78])
// 方式2:可变参数函数 + 元组
func processScores(subject: String, scores: Int...) -> (subject: String, scores: [Int]) {
return (subject, scores)
}
5、dart中的元组
dart中没有元组的概念,Dart 3.0 引入了记录(Records)如下:
Dart
// 位置字段记录(类似元组)
(String, int) userInfo = ('张三', 25);
print(userInfo.$1); // 张三 - 通过 $1, $2... 访问
print(userInfo.$2); // 25
// 命名字段记录
({String name, int age}) namedRecord = (name: '李四', age: 30);
print(namedRecord.name); // 李四
print(namedRecord.age); // 30
// 混合使用
(String, int, {String email}) mixed = ('王五', 28, email: 'wang@example.com');
print(mixed.$1); // 王五
print(mixed.$2); // 28
print(mixed.email); // wang@example.com