質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

1回答

2594閲覧

Typescriptでコレクションクラスの作り方

kappazushi

総合スコア13

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2017/09/27 09:12

編集2017/09/27 09:13

###前提・実現したいこと
Webpackを使ったアプリケーションで、Typescriptで配列にメソッドを生やしたいのですが、エラーが出て困っています。

質問は次の3点です。

  1. ソート後のthisをthisにアサインできないのですが、どのようにするべきでしょうか?
  2. Typescriptではどのようにコレクションを実装するべきでしょうか?
  3. lodashの箇所でキャストせずにUser[]とArray<User>をまとめる方法はないでしょうか?

因みに、やりたいことをGOで書きますと以下のような感じでになります。

go

1type User struct{ 2 id int64 3} 4type Users []User 5func (this *Users) setUser(user User) { 6 this = append(this, user) 7  // ソートする.... 8} 9 10func main() { 11 u := User{} 12 us := &Users{} 13 us.setUser(u); 14}

###発生している問題・エラーメッセージ

エラーメッセージ: 
Errro: [ts] Type 'Users' is not assignable to type 'this'.

###該当のソースコード

typescript

1 2import { 3 uniqBy, 4 remove, 5 orderBy, 6 find, 7 remove, 8 findIndex, 9} from 'lodash'; 10 11 12export class User extends Object { 13 id: string; 14 constructor() { 15 super(); 16 } 17} 18 19export class Users extends Array<User> { 20 constructor() { 21 super(); 22 23 // Set the prototype explictilly 24 // see https://github.com/Microsoft/TypeScript/issues/12123#issuecomment-265014802 25 Object.setPrototypeOf(this, Users.prototype); 26 27 } 28 29 /** 30 * 1件追加 31 * @param {User} user 32 */ 33 setUser(user: User): void { 34 let users = this; // 現状のコレクションをコピー 35 users.push(user); 36 // ソート 37 users = remove<User>(users, undefined) as Users; // Errro: [ts] Type 'Users' is not assignable to type 'this'. 38 39 users = uniqBy<User>(users, 'id') as Users; 40 users = orderBy<User>(users, ['created_at'], ['asc']) as Users; 41 this.splice(0, this.length); // コレクションの初期化 42 Object.assign(this, users); // コレクションを更新 43 } 44}

###補足情報(言語/FW/ツール等のバージョンなど)

"typescript": "2.5.2", "webpack": "2.4.1", "lodash": "4.17.4",

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

素直にメンバ変数として配列をもたせたほうが良いと思います

import { uniqBy, remove, orderBy, find, findIndex, } from 'lodash'; export class User extends Object { constructor(private id: string, private created_at: Date | undefined) { super(); if (created_at == undefined) { this.created_at = new Date(); } } } export class Users { list: Array<User|undefined>; constructor() { this.list = []; } public setUser(user: User | undefined) { let users = this.list; users.push(user); users = remove(users, undefined); users = uniqBy(users,'id') users = orderBy(users, ['created_at'],['asc']) this.list = users; } }

test code

import {User, Users} from '../extendArray'; it('Users', () => { let users = new Users(); // users.setUser(new User(1)); users.setUser(new User('1', new Date('2001-10-13'))); users.setUser(new User('1', new Date())); users.setUser(new User('1', new Date())); users.setUser(undefined); users.setUser(new User('15', new Date('2011-10-13'))); users.setUser(new User('7', new Date('2011-10-12'))); users.setUser(new User('10', new Date('2011-10-11'))); console.log(users); })

結果

PASS __test__/sample.test.ts ✓ Users (1ms) console.log __test__/sample.test.ts:14 Users { list: [ { id: '1', created_at: 2001-10-13T00:00:00.000Z }, { id: '10', created_at: 2011-10-11T00:00:00.000Z }, { id: '7', created_at: 2011-10-12T00:00:00.000Z }, { id: '15', created_at: 2011-10-13T00:00:00.000Z } ] } Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 0.175s, estimated 1s Ran all test suites. Watch Usage: Press w to show more.

投稿2017/10/08 04:15

m0a

総合スコア708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問