如何声明Typescript类型是AnyRecord或对象数组



简而言之,我想做的是:

interface Rec {
key: string;
}
type RecordOrList = Record<string, any> | Rec[];

因此,RecordOrList要么是某个对象,要么是特定对象的列表。

然而,这里的typescript似乎将Rec-的数组视为Any Records。例如,这是有效的代码,但我希望它是一个类型错误("int而不是string"(。

const x: RecordOrList = [{
key: 123,
}];

https://www.typescriptlang.org/play?ts=4.5.4#code/JYOwLgpgTgZghgYwgAgEoQcg3gWAFDLIDWEAngFzIDOYUoA5gNz4C+++YpADiuggPZQAJgHkoAGWA1kAXjQZBQgDw06IegBpkcEKQB8yAD7yEAbQC6zPPgEhpAD0p9FYydLmncBYmUoBACYAZg1WSyA

如何对上面的代码进行类型检查?

这里的问题是,令人惊讶的是,数组本身是有效的Record<string, any>(特别是Record<"length", number>(。

// Valid. WTF?
const x : Record<string, any> = [];
const a : keyof [] = "length"; // Valid
const b : keyof [] = "bogus";  // Invalid
Object.getOwnPropertyNames(x); // => ["length"]

您可以在此处使用unknown而不是any

interface Rec {
key: string;
}
type RecordOrList = Record<string, unknown> | Rec[];
// Type error as expected
const x: RecordOrList = [{
key: 123,
}];
// Works just fine
const y: RecordOrList = {key: 123}
const z: RecordOrList = [{
key: "123",
}];

或者只需将Record值类型缩小为标量类型列表。

最新更新