简而言之,我想做的是:
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值类型缩小为标量类型列表。