它应该number | undefined,因为不能保证对象上存在某个键。
我不认为这通常是正确的。我倾向于避免可选字段,并且使用一个比 { [K in MyKeys]: number } 可读性更高的实用程序来创建详尽的对象类型是非常好的。
没有什么能阻止您写 Partial<Record<string, number>> 或创建您自己的 PartialRecord。
type PartialRecord<K extends PropertyKey, T> = { [P in K]?: T }
我会将 Record 视为类型级宏,仅此而已。它没有哲学意义。
你写的完全等同于写一个简单的索引签名。这不是Record真正闪耀的地方。以下类型完全相同:
type foo = Record<string, number>;
type foo = { [K in string]: number };
type foo = { [k: string]: number };
Record 当你已经有一些联合类型并且你想从它创建一个对象类型时更有用:
type MyKeys = 'foo' | 'bar' | 'baz';
type foobar = Record<MyKeys, number>
// same as
type foobar = {
foo: number
bar: number
baz: number
};
TS 不是一个健全的类型系统。试图理解它只会令人沮丧。如果您将其视为丑陋的 Javascript 的丑陋类型级编程语言,您会更快乐;)