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