【发布时间】:2018-11-11 03:49:35
【问题描述】:
既然 typescript 3.1 引入了 mapped tuple types,我希望这个代码示例能够工作:
export interface SettingKey {
General_Language: 'en' | 'sl';
Map_InitialLongitude: number;
Map_InitialLatitude: number;
}
export function fetchSetting<K extends (keyof SettingKey)[]>
(...keys: K): Promise<SettingKey[K]> {
return null as any;
}
fetchSetting('General_Language', 'Map_InitialLongitude').then(x => {
return x['General_Language'] === 'de' // would want compilation error 'de' not in 'en' | 'sl'
})
但事实并非如此。错误是:
ttt.ts:7:83 - error TS2536: Type 'K' cannot be used to index type 'SettingKey'.
7 export function fetchSetting<K extends (keyof SettingKey)[]>(...keys: K): Promise<SettingKey[K]> {
~~~~~~~~~~~~~
ttt.ts:11:12 - error TS2571: Object is of type 'unknown'.
11 return x['General_Language'] === 'de'
~
显然,第二个错误是第一个错误的结果,所以这不是真正的问题。第一个是有问题的。
keys 是一个keyof SettingKey 的数组,所以我希望SettingKey[K] 是一个列出的属性类型的数组(所以,具体来说,在我放置的代码示例中,它将是['en' | 'sl', number]。来自pull request introducing the typescript feature:
如果 T 是一个数组类型 S[],我们将映射到一个数组类型 R[],其中 R 是 X 的一个实例,其中 S 代替了 T[P]。
但我猜这仅适用于映射类型,这里我有一个查找类型,这就是我猜它不起作用的原因?
我想我想表达的很清楚;这可以在打字稿中进行类型安全吗?
【问题讨论】:
-
如果你想要
['en' | 'sl', number],那么你应该查找x[0],而不是x['General_Language']。这是与映射元组的错误不同的错误。
标签: typescript