【发布时间】:2021-10-08 21:29:00
【问题描述】:
以下代码抛出错误:
“T”可以用与“数字”无关的任意类型实例化
interface Test {
a: <T>() => { b: T }
}
const eg: Test = {
a: () => ({ b: 3})
}
为什么它会抛出这个错误,我怎样才能让它接受它得到的类型是它会得到的唯一类型?
正是我想要做的:
type ForeignKeyValueType = {
foreignKey: <SCHEMA extends object>() => {
schema: SCHEMA,
propName: SCHEMA extends { props: any } ? KeyOf<SCHEMA["props"]> : never
}
}
【问题讨论】:
-
你的
Test接口的a方法是一个泛型函数,也就是说调用者可以指定类型参数T为他们想要的任何东西。如果你想让 implementer 指定类型参数,那么Test需要是一个通用的type。请参阅the answer 这个重复的问题;如果我将答案代码翻译成这个问题,我会得到this code。 -
调用者如何指定类型?来电者 (
eg) 似乎已经选择不指定。 -
来自链接的答案:“确实,有时编译器会推断这些类型参数,以便编写代码的人不必将其拼写出来,但再次,这些推断发生在调用时。”
-
等等,
eg不是来电者。eg是实现。当调用eg.a时,调用者可以指定T为他们想要的任何值,如eg.a<string>()... 类型系统要求返回{b: string}类型的值,但eg不能去做。问题在于,eg不能为调用者想要的任何T返回{b: T}类型的值。 -
当你说你想要
<T extends object>() => ({ obj: T; key: keyof T; })时,你可能真正想要的是<exists T extends object>{obj: T, key: keyof T},它可以像this一样间接表示,但我仍然不确定这个用例对你有多重要.如果我像这样递给你一对obj和key,你唯一能做的就是obj[key],对吧?但是obj[key]将是T[keyof T]类型,对你来说实际上是unknown,你所能做的就是String(obj[key])或其他一些采用unknown或any值的操作。
标签: typescript typescript-generics