【发布时间】:2019-12-12 01:27:18
【问题描述】:
是否可以强制将泛型类型(此处为T)作为接口的子集?
示例:
interface Type {
a: () => number
b: () => string
}
const func = <T /* Some condition */>(): T => { return ... }
func<Type>(); // OK
func<{a: () => number>(); // OK
func<{a: () => number, c: any}>(); // Error !
我为什么需要这个?
下面的案例构建了一个返回类型为Type的接口。 (TypeReturn 的意思类似于 {a: number, b: string})。
type TypeReturn<T> = { [key in keyof T]: (ReturnType<Type[key]>)[] }
但是 typescript 在Type[key] 抱怨,因为他无法确保T 将成为Type 的键。
【问题讨论】:
-
您对问题的更新使我使用
T extends Partial<Type>的回答无效。如果你不能做你要求做的事,我不会感到惊讶,因为通常你有T和U extends T,你可以使用U,你可以使用T.我不明白你为什么想让{a: () => number, c: any}失败。这个问题似乎相关,可能是重复的目标:How to set lower-bound to type parameters in TypeScript? -
在对我的回答发表评论时,您说 “我没想到
func<{c: any}>()能在func<{a: () => number, c: any}>();不工作时工作。” 前者与Type,但后者确实与Type有共同之处:{a: () => number}。如果你想让你的第二个例子 (func<{a: () => number>();) 工作,正如我上面所说的,我认为你不会让func<{a: () => number, c: any>();失败。但我不是 TypeScript 向导,它有很多的力量,所以... :-)
标签: typescript typescript-typings typescript-generics