【发布时间】:2019-09-22 04:52:48
【问题描述】:
我有一个用例,其中外部查询返回一个对象,该对象具有与我的一个接口同名的属性。正如您在示例 executeQuery 函数中看到的那样,如果我将“消息”作为查询传递,那么我将返回一个具有 1 个名为“消息”的属性的对象。
我希望能够创建一个具有 1 个属性的 T 通用接口,其中名称是 T 的名称,类型是 T。
我知道对此有运行时解决方案,但我想知道这是否可能在编译时仅使用 Typescript 类型。
共享代码:
function executeQuery<T>(query: "message" | "mailbox") {
const data = query === "message" ?
{ Message: { id: 1 } } as unknown as T :
{ Mailbox: { id: 2 } } as unknown as T
return { data: data }
}
interface Message {
id: number
}
interface Mailbox {
id: number
}
第一种解决方案:
interface AllContainer {
Message: Message
Mailbox: Mailbox
}
const messageQueryResult = executeQuery<AllContainer>("message")
console.log(messageQueryResult.data.Message.id)
const mailboxQueryResult = executeQuery<AllContainer>("mailbox")
console.log(mailboxQueryResult.data.Mailbox.id)
第二个解决方案:
interface MessageContainer {
Message: Message
}
interface MailboxContainer {
Mailbox: Mailbox
}
const messageQueryResult2 = executeQuery<MessageContainer>("message")
console.log(messageQueryResult2.data.Message.id)
const mailboxQueryResult2 = executeQuery<MailboxContainer>("mailbox")
console.log(mailboxQueryResult2.data.Mailbox.id)
我想做什么:
interface GenericContainer<T> {
[T.Name]: T // invalid Typescript
}
const messageQueryResult3 = executeQuery<GenericContainer<Message>>("message")
console.log(messageQueryResult3.data.Message.id)
const mailboxQueryResult3 = executeQuery<GenericContainer<Mailbox>>("mailbox")
console.log(mailboxQueryResult3.data.Mailbox.id)
【问题讨论】:
标签: typescript types