如何在TypeScript中创建一个只接受包含两个或更多元素的数组的类型?
void MainWindow::setItemLabel(){
if(!scene->selectedItems().isEmpty())
{
auto *item = scene->selectedItems().first();
DiagramItem *it = static_cast<DiagramItem *>(item);
if(it){
QDialog *diag = new QDialog(this);
QComboBox *box = new QComboBox();
QLineEdit *lt = new QLineEdit();
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
| QDialogButtonBox::Cancel);
QVBoxLayout *mainLayout = new QVBoxLayout();
connect(buttonBox, SIGNAL(accepted()), diag, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()), diag, SLOT(reject()));
mainLayout->addWidget(lt);
mainLayout->addWidget(buttonBox);
diag->setLayout(mainLayout);
if(diag->exec() == QDialog::Accepted){
it->setText(lt->text())
}
}
}
}
答案 0 :(得分:15)
这可以通过以下类型实现:
#include <QApplication>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>
#include <QLabel>
#include <QTimer>
class GraphicsProxyWidget: public QGraphicsProxyWidget{
public:
using QGraphicsProxyWidget::QGraphicsProxyWidget;
QRectF boundingRect() const{
if(widget())
return QRectF(widget()->rect());
return QGraphicsProxyWidget::boundingRect();
}
};
class DiagramItem: public QGraphicsPolygonItem{
QLabel *label;
GraphicsProxyWidget *pMyProxy ;
public:
explicit DiagramItem(QGraphicsItem *parent=nullptr):QGraphicsPolygonItem(parent) {
label = new QLabel;
pMyProxy = new GraphicsProxyWidget(this);
pMyProxy->setWidget(label);
label->setTextInteractionFlags(Qt::TextEditorInteraction);
label->setStyleSheet("QLabel { background-color : red; color : blue; }");
setText(QString("I AM A SQARE DADADA"));
setBrush(Qt::green);
}
void setText(const QString & text){
label->setText(text);
label->adjustSize();
pMyProxy->setPos(boundingRect().center()-label->rect().center());
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView w;
QGraphicsScene *scene = new QGraphicsScene;
w.setScene(scene);
auto it = new DiagramItem;
QPolygonF myPolygon({QPointF(-120, -80), QPointF(-70, 80),
QPointF(120, 80), QPointF(70, -80),
QPointF(-120, -80)});
it->setPolygon(myPolygon);
scene->addItem(it);
QTimer::singleShot(1000, [it](){
it->setText("some text");
});
w.show();
return a.exec();
}
答案 1 :(得分:10)
这是一个古老的问题,答案很好(它也对我有帮助),但是我在玩游戏时也偶然发现了这个解决方案。
我已经定义了一个类型化的元组(type Tuple<T> = [T, T];
),然后在其下定义了一个如上所述的两个或多个数组(type ArrayOfTwoOrMore<T> = { 0: T, 1: T } & T[];
)。
我想到尝试使用Tuple<T>
结构代替{ 0: T, 1: T }
,就像这样:
type ArrayOfTwoOrMore<T> = [T, T, ...T[]];
它奏效了。真好!稍微简洁一些,也许在某些用例中可能会更清楚。
值得一提的是,元组没有必须是两个相同类型的项。 ['hello', 2]
之类的东西是有效的元组。在我的小代码段中,它恰好是一个合适的名称,并且需要包含两个相同类型的元素。
答案 2 :(得分:4)
2021 年更新:缩写:
type arrMin1Str = [string, ...string[]]; // The minimum is 1 string.
或
type arrMin2Strs = [string, string, ...string[]]; // The minimum is 2 strings.
或
type arrMin3Strs = [string, string, string, ...string[]]; // The minimum is 3 strings.
OR ...等等
这只是@KPD 和@Steve Adams 答案的补充,因为所有指定的类型都相同。 自 TypeScript 3.0+ (2018) 起,这应该是有效的语法。
答案 3 :(得分:0)
type FixedTwoArray<T> = [T,T]
interface TwoOrMoreArray<T> extends Array<T> {
0: T
1: T
}
let x: FixedTwoArray<number> = [1,2];
let y: TwoOrMoreArray<string> = ['a','b','c'];