Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeScript:检测泛型返回类型_Javascript_Typescript_Generics_Types - Fatal编程技术网

Javascript TypeScript:检测泛型返回类型

Javascript TypeScript:检测泛型返回类型,javascript,typescript,generics,types,Javascript,Typescript,Generics,Types,我想创建一个核心对话框类,以便在添加新对话框时,TS 将根据给定的输入自动解析对话框类型(及其返回类型)。我能够实现大部分,但在返回值方面我失败了 每个对话框返回一个承诺,承诺结果应基于传递的对话框类型,例如 当T为PromptDialogOptionsreturnPromise时 当T为ConfirmDialogOptionsreturnPromise时 而当T为MessageDialogOptions时,则返回Promise 我创建对话框的实际代码(由于长度原因,我已标记了产生错误的行,

我想创建一个核心对话框类,以便在添加新对话框时,TS 将根据给定的输入自动解析对话框类型(及其返回类型)。我能够实现大部分,但在返回值方面我失败了

每个对话框返回一个
承诺
,承诺结果应基于传递的
对话框
类型,例如

  • T
    PromptDialogOptions
    return
    Promise
  • T
    ConfirmDialogOptions
    return
    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.'
})