2017-02-27 19 views
0
export abstract class GridColumn { 
    public field?: string; 
    public sortField?: string; 
    public header?: string; 
    public footer?: string; 
    public sortable?: any = true; 
    public editable?: boolean = false; 
    public filter?: boolean = true; 
    public filterMatchMode?: string = 'contains'; 
    public filterPlaceholder?: string; 
    public style?: any; 
    public styleClass?: string; 
    public hidden?: boolean = false; 
    public selectionMode?: string = 'multiple'; 
    public frozen?: boolean; 
} 

たとえば、これを行うと、定義されたプロパティを持つオブジェクトだけが返されます。私が欲しいものオブジェクトリテラルを持つAngular2 init抽象クラス

private gridConf: GridColumn = <GridColumn>{ 
    field: "test2", 
    header: "Test2", 
    filter: true, 
    filterMatchMode: "contains", 
    filterPlaceholder: "Search from Test", 
    sortable: true, 
    selectionMode: "single" 
}; 

は、定義されているすべてのプロパティと、すべてのデフォルト値を持つタイプGridColumnの目的です。
これは動作しません:

private gridConf: GridColumn = GridColumn({ 
    field: "test2", 
    header: "Test2", 
    filter: true, 
    filterMatchMode: "contains", 
    filterPlaceholder: "Search from Test", 
    sortable: true, 
    selectionMode: "single" 
}); 

コンストラクタは長いものを書くために私を強制すると私は常に特定の順序ですべてのプロパティを追加する必要があります。

最終目標は、任意の順序ですべてのデフォルトおよび/または定義された特性を有している。このようなものを使用することです:私は見つけることができる「ハック」

private columns: Array<GridColumn> = [ 
    <GridColumn>{ 
     field: "test", 
     selectionMode: "single", 
     filter: true, 
     filterMatchMode: "contains", 
     filterPlaceholder: "Search from Test", 
     sortable: true, 
     header: "Test" 

    }, 
    <GridColumn>{ 
     field: "test2", 
     header: "Test2", 
     filter: true, 
     filterMatchMode: "contains", 
     filterPlaceholder: "Search from Test", 
     sortable: true, 
     selectionMode: "single" 
    } 
]; 

最も近い場所フィールド、抽象を削除して追加することでした

public constructor(
    fields?: GridColumn) { 
    if (fields) Object.assign(this, fields); 
} 

答えて

1

これは実際には可能ではありませんが、私はそう思わないかもしれません。これはベストプラクティスではありませんが、本当に本当にそれが欲しいのなら、これがあなたができる方法です。

export interface IGridColumn { 
    public field?: string; 
    public sortField?: string; 
    public header?: string; 
    public footer?: string; 
    public sortable?: boolean; 
    public editable?: boolean; 
    public filter?: boolean; 
    public filterMatchMode?: string; 
    public filterPlaceholder?: string; 
    public style?: any; 
    public styleClass?: string; 
    public hidden?: boolean; 
    public selectionMode?: string; 
    public frozen?: boolean; 
} 

使用

private columns: Array<GridColumn> = [ 
    new GridColumn(<IGridColumn>{ 
     field: "test", 
     selectionMode: "single", 
     filter: true, 
     filterMatchMode: "contains", 
     filterPlaceholder: "Search from Test", 
     sortable: true, 
     header: "Test" 

    }), 
    new GridColumn(<IGridColumn>{ 
     field: "test2", 
     header: "Test2", 
     filter: true, 
     filterMatchMode: "contains", 
     filterPlaceholder: "Search from Test", 
     sortable: true, 
     selectionMode: "single" 
    }) 
]; 

GridColumn

export class GridColumn implements IGridColumn { 

    public sortable: boolean = true; 
    public editable: boolean = false; 
    public filter: boolean = true; 
    public filterMatchMode: string = 'contains'; 
    public hidden: boolean = false; 
    public selectionMode: string = 'multiple'; 

    public field: string; 
    public sortField: string; 
    public header: string; 
    public footer: string; 
    public filterPlaceholder: string; 
    public style: any; 
    public styleClass: string; 
    public frozen: boolean; 

    constructor(data: IGridColumn = {}){ 
     Object.assign(this, data); 
    } 
} 

IGridColumn:あなたは非抽象クラスにnew GridColumn()を使用している場合FYI、デフォルト値のみが初期化されています

これはベストプラクティスではないと私は信じていることをもう一度強調しましょう。 Iで始まるインタフェースの名前を付けても、ぼやけています。D

関連する問題