我在 TypeScript playground 中有一段代码片段,请在这里查看。请注意格式。
enum MyTypes {
FIRST = "FIRST",
SECOND = "SECOND",
THIRD = "THIRD"
}
type TFirst = {
type: MyTypes.FIRST
foo: string
}
type TSecond = {
type: MyTypes.SECOND
foo: string
}
type TThird = {
type: MyTypes.THIRD
bar: string
}
type TConditionalType<T> =
T extends MyTypes.FIRST ? TFirst :
T extends MyTypes.SECOND ? TSecond :
T extends MyTypes.THIRD ? TThird :
null
const getMyObjectBasedOnType = <T extends MyTypes>(type: T): TConditionalType<T> | null => {
switch (type) {
case MyTypes.FIRST: {
return {
type: MyTypes.FIRST,
foo: 'test'
}
}
default: {
return null
}
}
}
const firstObject = getMyObjectBasedOnType(MyTypes.FIRST)
// firstObject is type of TFirst or null which is okay
if (firstObject) {
firstObject.foo
}
有一个函数getMyObjectBasedOnType(type: T)
,它根据type
参数返回一个条件类型的对象。这似乎有效,因为最终的firstObject
是TFirst | null
类型。这里一切都清楚。
我遇到的问题是在第31行的该函数内部发生了TypeScript错误,当我返回对象时。我收到了以下错误信息:Type '{ type: MyTypes.FIRST; foo: string; }' is not assignable to type 'TConditionalType<T>'.
我弄不清楚错在哪里。据我所知,那是TFirst
的一个对象,应该没问题。为什么我会收到这个错误,如何正确解决?
firstObject
完美地工作。它正确地是TFirst
,并且不允许我使用firstObject.bar
。我在case MyTypes.FIRST
内部有一个问题。我认为TypeScript应该知道对象是TFirst
或TConditionalType<T>
。我可以做这样的事情return { type: MyTypes.FIRST, foo: 'test' } as TConditionalType<T>
,但为什么我需要告诉TypeScript对象是那种类型呢? - Marek