Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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 用可选属性实例化类的正确方法_Javascript_Typescript_Casting - Fatal编程技术网

Javascript 用可选属性实例化类的正确方法

Javascript 用可选属性实例化类的正确方法,javascript,typescript,casting,Javascript,Typescript,Casting,我目前正在将一个JavaScript模块迁移到TypeScript,在使用可选属性强键入对象时遇到问题 这个例子很简单: 我有一个打开模态的方法。该方法只有一个参数,它是模态的不同选项的映射,并且都是可选的 与JavaScript一样: openConfirmDialog({text : "are you sure ?"}); openConfirmDialog({title : "Confirmation required", confirmAction : noop}); let conf

我目前正在将一个JavaScript模块迁移到TypeScript,在使用可选属性强键入对象时遇到问题

这个例子很简单:

我有一个打开模态的方法。该方法只有一个参数,它是模态的不同选项的映射,并且都是可选的

与JavaScript一样:

openConfirmDialog({text : "are you sure ?"});
openConfirmDialog({title : "Confirmation required", confirmAction : noop});
let confirmOptions : ConfirmDialogOptions = { text : "are you sure ?" };
等等

迁移到TypeScript时,我声明了一个表示所有这些不同选项的类:

class ConfirmDialogOptions {

    text : string;
    title : string;

    confirmAction : () => any;
    cancelAction  : () => any;

}
但是,当我们试图像在普通JavaScript中那样实例化此类时:

openConfirmDialog({text : "are you sure ?"});
openConfirmDialog({title : "Confirmation required", confirmAction : noop});
let confirmOptions : ConfirmDialogOptions = { text : "are you sure ?" };
编译器引发错误:

初始化类型不可分配给变量类型ConfirmDialogOptions

我被迫使用以下方法强制类型转换:

let a : ConfirmDialogOptions = {text: "lala"} as ConfirmDialogOptions;
这是可行的,但很好,它似乎有点过热,总体上让我想知道实例化TypeScript中具有许多或所有可选属性的类型化对象的正确方法是什么


正确的方法是什么?

不使用类声明接口,而是使用:


您希望使用的是类型脚本,您可以将其应用于自由浮动对象:

interface ConfirmDialogOptions {
  text?: string;
  title?: string;
  confirmAction?: () => any;
  cancelAction?: () => any;
}
不会做你认为它会做的事。。。它实际上是一个在普通JavaScript函数中充当糖分的函数

// ES6 Class
class Person {
    constructor(name) {
      this.name = name;
    }
}

// Equivalent JS
var Person = (function () {
    function Person(name) {
        this.name = name;
    }
    return Person;
}());

由于您正在定义一个
TypeScript,因此假定您打算让
ConfirmDialogOptions
新的ConfirmationDialogOptions(…)
调用中的实例相匹配,这与
{text:'hello}之类的普通JavaScript对象的类型不同

您可以通过将参数设置为带问号的可选参数来完成此操作

class ConfirmDialogOptions {    
   text ?: string;
   title ?: string;
   //
}
或者更好的声明类变量的方法是在构造函数中

class ConfirmDialogOptions {    
    constructor(private text?:string, private title?: string) {  }\
    //
}
另一种解决方案是给参数一个默认值

class ConfirmDialogOptions {    
    constructor(private text:string="Default text", private title: string="Default title") {  }
    //
}