【发布时间】:2021-01-14 19:20:35
【问题描述】:
我想定义一个映射类型,其中键 'foo' 和 'bar' 的类型为 number,所有其他键的类型为 string
我的第一个直觉是用这样的条件类型来解决这个问题:
type FooOrBar = 'foo' | 'bar';
type MyMappedType = {
[key in FooOrBar | string]: key extends FooOrBar ? number : string;
}
var x: MyMappedType = {
foo: 1, // Type 'number' is not assignable to type 'string'.(2322)
bar: 2, // Type 'number' is not assignable to type 'string'.(2322)
baz: 'I am a string' // ok!
}
这里的问题是 typescript 将 typealias FooOrBar | string 缩小到在 key 中键入 string。所以实际上打字稿将这种类型评估为
type MyMappedType = {
[key in string]: key extends FooOrBar ? number : string;
}
所以条件key extends FooOrBar 始终为假,类型定义对我的需要毫无用处。
我的第二个直觉是使用交叉类型:
type FooOrBar = 'foo' | 'bar';
type MyMappedType = {
[key in FooOrBar]:number;
} & {
[key in string]: string;
};
var x: MyMappedType = { // Type 'number' is not assignable to type 'string'.(2322)
foo: 1,
bar: 2,
baz: 'I am a string'
}
但这也不起作用。
有没有可能在 typescript 中定义这样的类型?
【问题讨论】:
标签: typescript types