Javascript TypeScript:检测泛型返回类型
我想创建一个核心对话框类,以便在添加新对话框时,TS 将根据给定的输入自动解析对话框类型(及其返回类型)。我能够实现大部分,但在返回值方面我失败了 每个对话框返回一个Javascript TypeScript:检测泛型返回类型,javascript,typescript,generics,types,Javascript,Typescript,Generics,Types,我想创建一个核心对话框类,以便在添加新对话框时,TS 将根据给定的输入自动解析对话框类型(及其返回类型)。我能够实现大部分,但在返回值方面我失败了 每个对话框返回一个承诺,承诺结果应基于传递的对话框类型,例如 当T为PromptDialogOptionsreturnPromise时 当T为ConfirmDialogOptionsreturnPromise时 而当T为MessageDialogOptions时,则返回Promise 我创建对话框的实际代码(由于长度原因,我已标记了产生错误的行,
承诺
,承诺结果应基于传递的对话框
类型,例如
- 当
为T
returnPromptDialogOptions
时Promise
- 当
为T
returnConfirmDialogOptions
时Promise
- 而当
为T
时,则返回MessageDialogOptions
Promise
- 预期结果:
Promise
- 预期结果:错误,因为对话框不继承自
BaseDialog
- 预期结果:
Promise
使用的所有类型
导出常量枚举对话框类型{
对话信息,
对话确认,
对话框提示
}
导出接口基本对话框{
标题:字符串;
消息:字符串;
类型:对话框类型;
解析器?:(值?:T)=>无效;
}
导出接口MessageDialogOptions扩展BaseDialog{}
导出接口ConfirmDialogOptions扩展BaseDialog{}
导出接口PromptDialogOptions扩展BaseDialog{
maxLength:数字;
}
//工会对话
导出类型DialogOptions=MessageDialogOptions | PromptDialogOptions | ConfirmDialogOptions;
为什么不简单
function newDialog<R>(dialog: BaseDialog<R>): Promise<R> {
...
为什么不简单呢
function newDialog<R>(dialog: BaseDialog<R>): Promise<R> {
...
谢谢你的解决方案!我没有使用重载的主要原因是我无法将它们放到界面中,我需要它们主要是为了React的可访问性和功能,因为我希望这个“对话框存储”成为一个实际的React钩子。感谢您的解决方案!我没有使用重载的主要原因是我无法将它们放到界面中,我需要重载主要是为了React的可访问性和功能,因为我希望这个“对话框存储”成为一个实际的React钩子。
const dialog = {
title: "Invalid",
message: "Invalid dialog is bad!",
type: DialogType.DIALOG_MESSAGE
}
newDialog(dialog);
const promptDialog : PromptDialogOptions = {
title: "Hello",
message: "Say hello",
maxLength: 10,
type: DialogType.DIALOG_PROMPT
};
newDialog(promptDialog);
export const enum DialogType {
DIALOG_MESSAGE,
DIALOG_CONFIRM,
DIALOG_PROMPT
}
export interface BaseDialog<T> {
title: string;
message: string;
type: DialogType;
resolver?: (value?: T) => void;
}
export interface MessageDialogOptions extends BaseDialog<void> { }
export interface ConfirmDialogOptions extends BaseDialog<boolean> { }
export interface PromptDialogOptions extends BaseDialog<string | number> {
maxLength: number;
}
// Union dialogs
export type DialogOptions = MessageDialogOptions | PromptDialogOptions | ConfirmDialogOptions;
function newDialog<R>(dialog: BaseDialog<R>): Promise<R> {
...
function newDialog(dialog: MessageDialog): Promise<void>;
function newDialog(dialog: ConfirmDialog): Promise<boolean>;
function newDialog(dialog: PromptDialog): Promise<string | number>;
function newDialog<R>(dialog: BaseDialog<R>): Promise<R> {
// implementation here
}
newConfirmDialog({
title: 'Really launch rockets?',
text: 'Once launched, they can not be recalled.'
})