1. 字面量类型
TypeScript 中的字面量类型(Literal Types)是一种特殊的类型,它只能匹配特定值,例如 'hello'
、42
或 true
。这些类型经常用于更精确地描述值的预期类型。
1.1 字面量类型的使用
你可以使用字面量类型来限制变量或函数参数的值。例如:
type TokenKind = 'identifier' | 'number' | 'string';
function parseToken(kind: TokenKind): void {
// ...
}
parseToken('identifier'); // 正确
parseToken('invalid'); // 错误,因为 'invalid' 不是 TokenKind 的一个成员
在上面的例子中,TokenKind
是一个字面量类型,它有三个可能的值:'identifier'
、'number'
和 'string'
。函数 parseToken
的参数 kind
被限制为这三个值之一。
1.2 字面量类型与枚举
虽然字面量类型和枚举(Enum)在某些情况下是相似的,但它们在 TypeScript 中有不同的用途。枚举主要用于表示一组相关的命名常量,而字面量类型则用于更精确地描述一个值的预期类型。
2. 索引签名
索引签名(Index Signatures)允许你定义一个对象类型中属性的可能键,以及这些键对应的值的类型。
2.1 索引签名的使用
索引签名常常用于定义对象字面量类型或类型别名,它们应该具有某些特定的属性。
type StringDictionary = {
[key: string]: string;
};
const dict: StringDictionary = {
a: 'foo',
b: 'bar',
c: 'baz'
};
在上面的例子中,StringDictionary
是一个类型别名,它表示一个对象,其键是字符串,值也是字符串。
2.2 索引签名的类型
索引签名的类型可以是任何类型,包括其他复合类型。例如,你可以定义一个索引签名,其中键是字符串,但值是一个对象:
type KeyValue = {
[key: string]: {
key: string;
value: number;
};
};
const data: KeyValue = {
'a': {
key: 'a',
value: 1
},
'b': {
key: 'b',
value: 2
}
};
在上面的例子中,KeyValue
是一个类型别名,它表示一个对象,其键是字符串,值是一个具有两个属性(key
和 value
)的对象。
2.3 可选索引签名
你可以使用 ?
符号来标记索引签名是可选的。这意味着对象可以没有该索引签名的属性,或者该属性可以是 undefined
。
type OptionalDictionary = {
[key: string]?: string;
};
const optionalDict: OptionalDictionary = {};
在上面的例子中,OptionalDictionary
是一个类型别名,它表示一个对象,其键是字符串,值是一个可选的字符串。
3. 类型别名与索引签名
你可以将索引签名用作类型别名的一部分,以定义更复杂的类型。
type MyType = {
[key: string]: {
a: string;
b: number;
};
};
const myObject: MyType = {
a: {
a: 'foo',
b: 42
},
b: {
a: 'bar',
b: 100
}
};
在上面的例子中,MyType
是一个类型别名,它表示一个对象,其键是字符串,值是一个具有 a
和 b
属性的对象。
总结
字面量类型和索引签名是 TypeScript 类型系统的重要部分,它们可以帮助你更精确地描述变量的预期类型。字面量类型用于限制变量或函数参数的值,而索引签名则用于定义对象类型中属性的可能键和对应的值类型。通过结合使用这些特性,你可以创建出既清晰又安全的代码。
上一章:枚举类型与常量枚举 下一章:泛型编程基础与进阶