TypeScript的映射类型是否应该为每个键都有一个值?

时间:2019-06-12 10:46:15

标签: typescript mapped-types

我想知道映射类型中的每个键是否应该具有定义的值。

我不希望出现这种情况,因为它会要求很多值。但是,我希望Partial<T>可分配给映射类型T,但不是。此外,从映射类型读取值时,无需进行typeof value === 'undefined'检查。


type Mapped = { [key: string]: string };

// This works, so not all keys have to be defined
const mapped: Mapped = { 'a': 'b' };

// This is valid even with strict checks even though 's' is undefined
const s: string = mapped['c'];

const partialMapped: Partial<Mapped> = mapped;
// This doesn't work because `Partial<Mapped>` is of type `{ [key: string]: string | undefined }`
const secondMapped: Mapped = partialMapped;

由于{ 'a': 'b' }可分配给Mapped变量,因此我希望Partial<Mapped>也可分配给Mapped,但事实并非如此。这是因为值undefined与缺少键不同吗? Partial上是否有一个变种,使键成为可选键?

1 个答案:

答案 0 :(得分:0)

您的代码使用了严格的null检查功能,因为您随后可以将CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload)) 的值分配给undefined。我们在这里谈论 values ,键是无所谓的!

您对string的索引类型签名不承诺特定的键,因此可以为零或多个键分配类型。不允许的是分配非字符串值(例如Mappedundefined),这就是突出显示错误的地方。

以下是该错误防范的人为例子:

null

部分版本可以接受未定义的值。 “完整”版本不允许这样做。

var undef: undefined;
const partialMapped: Partial<Mapped> = {a: undef, b: undef}; // Works