【发布时间】:2019-12-21 22:54:55
【问题描述】:
我正在尝试定义一个 TypeScript 定义,如下所示:
interface Config {
fieldName: string
}
function foo<T extends Config>(arr: T[]): Record<T['fieldName'], undefined>
function foo(arr: Config[]): Record<string, undefined> {
const obj = {}
_.forEach(arr, entry => {
obj[entry.fieldName] = undefined
})
return obj
}
const result = foo([{fieldName: 'bar'}])
result.baz // This should error since the array argument did not contain an object with a fieldName of "baz".
上面的代码受到Dynamically generate return type based on parameter in TypeScript 的高度启发,这几乎正是我想要做的,除了我的参数是一个对象数组而不是字符串数组。
问题是result 的类型是Record<string, undefined>,而我希望它是Record<'bar', undefined>。我很确定Record<T['fieldName'], undefined> 的返回定义不正确(因为T 是Config 类对象的数组),但我不知道如何使用泛型类型正确指定它。
非常感谢任何帮助。
【问题讨论】:
-
Linter 永远不会“捕获”严格类型,因为
const obj = {}隐式属于any类型。所以,你会得到一个运行时错误Property 'baz' does not exist on type Record<'bar', undefined>,但是在.之后你不能严格得到它
标签: typescript typescript-typings