TypeScript数组,长度最小

时间:2018-04-19 00:28:01

标签: typescript

如何在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())
            }
        }
    }
}

4 个答案:

答案 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();
}

TypeScript Playground Link

答案 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'];

TypeScript Playground