Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 4

18
votes
answers
24 views
+10

如何将月份值从一个Date对象复制到另一个Date对象?[重复]

这个问题在这里已有答案:

  • Date.getMonth()方法有错误吗? 9个答案

    给定两个Date对象,如何正确设置第一个对象的月份到另一个对象的月份?

    我正面临着一个任务将日期,月份和年份从一个Date对象复制到另一个Date对象。复制日期和年份按预期工作,当我试图复制月份时问题就出现了。 < p>使用 b.setMonth(a.getMonth())会导致b的月份过多。

    使用 b.setMonth(a.getMonth() - 1)但是,导致b的第一个月比需要的少。

    以下打字代码:

     < code> let a = new Date(2018,1,12); 设b = new Date(); 的console.log(a)的 的console.log(b)中; 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth()); 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth() -  1); 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(B。得到月());   

    返回:

      2018年2月12日星期一00:00:00 GMT + 0100 2019年8月29日星期四16:11:03 GMT + 0200 === = 1 7 ==== 1 2 ==== 1 0 // 2  -  1 = 0?  

    看似2 - 1应该给1 (a.getMonth() - 1),但显然Date对象的行为不同。在javascript / typescript中将月份从一个Date对象复制到另一个对象的正确方法是什么?我想将两个日期转换为字符串,复制正确的字符并将字符串解析回Date会起作用,但我想知道是否有更简单,更清晰的方法。 03 GMT + 0200 ==== 1 7 ==== 1 2 ==== 1 0 // 2 - 1 = 0?

    看似2 - 1应该给1 (a.getMonth() - 1),但显然Date对象的行为不同。在javascript / typescript中将月份从一个Date对象复制到另一个对象的正确方法是什么?我想将两个日期转换为字符串,复制正确的字符并将字符串解析回Date会起作用,但我想知道是否有更简单,更清晰的方法。 03 GMT + 0200 ==== 1 7 ==== 1 2 ==== 1 0 // 2 - 1 = 0?

    看似2 - 1应该给1 (a.getMonth() - 1),但显然Date对象的行为不同。在javascript / typescript中将月份从一个Date对象复制到另一个对象的正确方法是什么?我想将两个日期转换为字符串,复制正确的字符并将字符串解析回Date会起作用,但我想知道是否有更简单,更清晰的方法。

沙发
+90
+50

问题是 setMonth()方法有一个可选的第二个参数,即日期( DOCS )。如果您没有提供当天的价值,它将自动使用其中一个日期。

因此,您的A日期是2018年2月12日,而您的B日期是2019年8月29日。

通过 b.setMonth(a.getMonth()); ,你隐含地说 b.setMonth(1,29); (1是a.getMonth( )29是b日期的日期。

所以你试图将日期设定为2月29日,这在2019年是不可能的,它将月份改为1到3月(第2个月) )。

+70

这是因为这是你的幸运(或不幸!)日。这是你工作的特定日期。

今年2月只有28天。当您将“2019年8月29日”的月份设置为2月时,您将尝试创建无效日期“2019年2月29日”。这可以概括为“2019年3月1日”。

如果你昨天尝试过这个实验,你就不会看到这个问题。

+20

这是每月的天数问题。

当你这样做时:

  b.setMonth(a.getMonth());   

你得到的是b日期,但是以2月为月份:2019年2月29日星期四16:11:03 GMT + 0200

2019年2月没有29天。所以日期实际上是3月1日:2019年3月1日星期四16:11:03 GMT + 0200

这就是为什么你在第二组控制台日志中获得第2个月的原因。

最后你设定b.month不是一个月,所以它从一个日期(从二月到一月)减去一个月。

0

因为您使用a.getMonth()而不是b.getMonth()。所以你的主要月份是1而不是2。

0

在设置月份时,您还需要指定可以使用此代码的日期

  var a =新日期(2018年,1日,12日); var b = new Date(); 的console.log(a)的 的console.log(b)中; 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth(),1); 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth() -  1,1); 的console.log( '===='); 的console.log(a.getMonth());

     
			
        
0
votes
answers
36 views
+10

Cytoscape佈局 - 沒有這樣的佈局可樂發現

0

我正在使用Cytoscape Angular 2項目與Typescript並希望使用可樂佈局。因此,我使用npm將依賴項添加到我的項目中。由於我正在使用Angular 2與Typescript,我已經將js模塊首先添加到angular-cli.json文件中,然後添加到index.html文件中。之後,在我的NetworkComponent,這是我使用的顯示圖形,我導入庫如下角度分量:Cytoscape佈局 - 沒有這樣的佈局可樂發現

declare var cola:any;

然後我想使用的佈局如下:

this.cyto = cytoscape({ 
      container: document.getElementById("graph"), 
      elements: this.graph.elements, 
      style: res.json() 
      }); 
    this.cyto.layout({name: "cola"}); 

圖表不顯示,我得到以下錯誤在控制檯:

不能適用佈局:未找到這樣的佈局「可樂」;你有沒有包含它的 JS文件?

我可以使用concentric佈局和圖形顯示,但我得到了其他佈局擴展,例如cose-bilkentspringy同樣的錯誤。

如何導入可樂庫並將其用作我的圖形佈局?這裏可能有什麼問題?

沙发
0
0

這是一個簡單的修復。事實證明,我忘記了cytoscape-cola.js所要求的index.html中的cola.js文件的引用。我以爲只使用cytoscape-cola.js就足夠了,但是在添加可樂 js文件後,它工作正常。

0
votes
answers
58 views
+10

類型錯誤:無法在web服務

0

讀取未定義的屬性「然後」我有這樣的錯誤:類型錯誤:無法在web服務

類型錯誤:未定義

at FactoryMethod.readItemsAndSetStatus (FactoryMethod.tsx:140:6) at FactoryMethod.componentDidMount (FactoryMethod.tsx:77:10)

調試器中斷在這種方法不能讀取屬性「然後」(當時的聲明):

// read items using factory method pattern and sets state accordingly 
    private readItemsAndSetStatus(): void { 
    this.setState({ 
     status: "Loading all items..." 
    }); 

    const factory: ListItemFactory = new ListItemFactory(); 
    factory.getItems(this.props.spHttpClient, this.props.siteUrl, this.props.listName) 
    .then((items: IListItem[]) => { 
     const keyPart: string = this.props.listName === "GenericList" ? "" : this.props.listName; 
     // the explicit specification of the type argument `keyof {}` is bad and 
     // it should not be required. 
     this.setState<keyof {}>({ 
      status: `Successfully loaded ${items.length} items`, 
      ["Details" + keyPart + "ListItemState"] : { 
      items 
      }, 
      columns: buildColumns(items) 
     }); 
    }); 
    } 

工廠代碼是這樣的: (GenericList情況)

import { SPHttpClient, SPHttpClientResponse } from "@microsoft/sp-http"; 
import { IWebPartContext } from "@microsoft/sp-webpart-base"; 
import { IListItem} from "./models/IListItem"; 
import { IFactory } from "./IFactory"; 
import { INewsListItem } from "./models/INewsListItem"; 
import { IDirectoryListItem } from "./models/IDirectoryListItem"; 
import { IAnnouncementListItem } from "./models/IAnnouncementListItem"; 

export class ListItemFactory implements IFactory { 
    private _listItems: IListItem[]; 
    public getItems(requester: SPHttpClient, siteUrl: string, listName: string): Promise<IListItem[]> { 
     switch(listName) { 
      case "GenericList": 
       let items: IListItem[]; 
       // tslint:disable-next-line:max-line-length 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id,Modified,Created,Author/Title,Editor/Title&$expand=Author,Editor`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: IListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: IListItem[] }) => { 
        console.log(JSON.stringify(json.value)); 
        items=json.value.map((v,i)=>({ 
         key: v.id, 
         id: v.id, 
         title: v.title, 
         created: v.created, 
         createdby: v.Author.Title, 
         modified: v.modified, 
         modifiedby: v.Editor.Title       
        })); 
        return items; 
        }); 
       break;  
      case "News": 
       let newsitems: INewsListItem[]; 
       // tslint:disable-next-line:max-line-length 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id,Modified,Created,Created By,Modified By,newsheader,newsbody,expiryDate`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: INewsListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: INewsListItem[] }) => { 
        return this._listItems = json.value; 
       }); 
       break;  
      case "Announcements": 
       let announcementitems: IAnnouncementListItem[]; 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: IAnnouncementListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: IAnnouncementListItem[] }) => { 
        return this._listItems = json.value; 
       }); 
       break;  
      case "Directory": 
       let directoryitems: IDirectoryListItem[]; 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: IDirectoryListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: IDirectoryListItem[] }) => { 
        return this._listItems = json.value; 
       }); 
       break;  
      default: 
       return null; 
     } 
     } 
} 

我Ilistiteminterface代碼

export interface IListItem { 
    [key: string]: any; 
    id: string; 
    title: string; 
    modified: Date; 
    created: Date; 
    modifiedby: string; 
    createdby: string; 
} 

的JSON從服務返回的是:

[{ 
    "Author": { 
     "Title": "Luis Valencia" 
    }, 
    "Editor": { 
     "Title": "Luis Valencia" 
    }, 
    "Id": 1, 
    "ID": 1, 
    "Title": "Generic List Item 1", 
    "Modified": "2017-10-23T20:02:22Z", 
    "Created": "2017-10-23T20:02:22Z" 
    }, 
    { 
    "Author": { 
     "Title": "Luis Valencia" 
    }, 
    "Editor": { 
     "Title": "Luis Valencia" 
    }, 
    "Id": 2, 
    "ID": 2, 
    "Title": "Generic List Item 2", 
    "Modified": "2017-11-07T17:52:34Z", 
    "Created": "2017-11-07T17:52:34Z" 
    } 
] 

調試的東西,我注意到那是什麼時候的JSON地圖顯然是行不通的。 見截圖,項目是未定義

enter image description here

+1

getItems()函數中的開關分支都沒有返回任何東西。你需要實際返回Promise:所以'return requester.get(...)。then(...)' – Duncan

+0

@Duncan說了什麼,你的默認情況下也需要返回一個promise。 –

+0

請精心設計,我不是專家,所以不知道如何解決它 –

沙发
0
1

你不能從getItems返回請求者。在每個case語句中,在請求者之前添加一個return語句。

return requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}') ... 

。然後是一個方法和無極無極狀物體,並且由於getItems要麼返回undefined(或在默認情況下,空)則引發錯誤。

+0

不知道我明白了,你能詳細闡述我需要解決的問題和方法嗎? –

+0

例如:'case「Announcements」:return requester.get(...'getItems不知道如何返回給它的調用者,但沒有爲每個開關case返回語句。 – MynockSpit

+0

這個答案並不能真正解決我的問題 –

0
votes
answers
56 views
+10

爲Google的Prettify創建自己的規則的最先進的方法是什麼?

2

爲Google的Prettify創建自己的規則的最先進的方法是什麼?爲Google的Prettify創建自己的規則的最先進的方法是什麼?

我說的不是改變現有規則的顏色,此外,我要創建新的規則:

  • 如殼/ bash的
  • 也許在極值情況下的一首詩,其中我想展現「愛」字加粗

的所有出場還是我要顯示一棵樹,並標記所有spec.ts文件大膽,如:

 
    ├── src 
    │   ├── app 
    │   │   ├── app-routing.module.ts 
    │   │   ├── app.component.css 
    │   │   ├── app.component.css.map 
    │   │   ├── app.component.html 
    │   │   ├── app.component.scss 
    │   │   ├── app.component.spec.ts 
    │   │   ├── app.component.ts 
    │   │   ├── app.module.ts 
    │   │   └── lesson 
    │   │    ├── lesson.component.css 
    │   │    ├── lesson.component.css.map 
    │   │    ├── lesson.component.html 
    │   │    ├── lesson.component.scss 
    │   │    ├── lesson.component.spec.ts 
    │   │    └── lesson.component.ts 
+1

有一個內置的shell模式。 –

沙发
0
0

最簡單的方法是從existing example開始工作。

如果你看一下這個文件,你可以看到它有一些樣板圍繞元組的兩個列表:

PR['registerLangHandler'](
    PR['createSimpleLexer'](
     [ 
      // Some tuples 
     ], 
     [ 
      // Some more tuples 
     ], 
     [/* Some file extensions without dot */])); 

如果文件擴展名列表中包含"ext"和美化的要求美化代碼塊用那麼這個處理程序將被使用。這兩組元組的結構相似。 下面是一些與第一組

['opn',    /^(+/, null, '('], 
['clo',    /^)+/, null, ')'], 

,這裏是一個從第二組。

[PR['PR_KEYWORD'],  /^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|...)/, null], 

PR['PR_KEYWORD']predefined token type與風格在predefined stylesheet相匹配:

.kwd { color: #008 } /* a keyword */ 

什麼

['opn',    /^(+/, null, '('], 

的意思是,美化時,如果代碼的開頭開始與/^(+/,然後輸入被包裹在<span class="opn">...</span>opn(LISP左括號)是一個字符串文字,因爲它沒有預定義的常量。如果你定義了你自己的標記類型類,你可能需要爲它們定義樣式規則,以適應任何頁面加載的需求。

右側的字符串'('被視爲一個字符列表,這樣該規則是唯一一個在輸入文本以其中一個字符開頭時適用的規則。這是過去幾年對IE 6的一個重要優化。

兩組元組唯一的區別在於第一個列表中的元素有這個額外的獨佔字符元素。

IIRC,null支持的功能很少發現,如果有必要,不再支持。您放入該位置的任何值都將被忽略。

CSS處理程序有一些這方面的文檔,並演示了另一個功能。

['lang-css-kw', /^(-?(?:[_a-z]|(?:\[0-9a-f]+ ?))(?:[_a-z0-9-]|\(?:\[0-9a-f]+ ?))*)s*:/i], 

如果令牌類型與lang-開始,而不是產生<span class="lang-css-kw">...</span>,美化將查找的文件擴展名css-kw語言處理程序,並遞歸地應用,爲內容組1.此功能可能是矯枉過正這裏因爲現代JS引擎始終支持lookahead,但這是必要的,以便HTML模式可遞歸地將JS和CSS模式應用於<script><style>塊的內容。


美化可以處理任何只依賴從左到右傳遞令牌的轉換。它沒有辦法收集在邊桌上消除歧義的符號,所以沒有辦法區分這兩個C段:從

int t = 1; // t is declared as a variable, not a type 
t* x; // multiplication. "t" should not have class="typ" 

typedef int t // t is declared as a type 
t* x; // declare x as a pointer to a t. "t" should have class="typ" 

這有限的方法似乎更穩健面對經常出現在像stackoverflow這樣的網站上的代碼片斷和惡意代碼。

這是合理的編碼共同語言的約定如

  • 類型名稱以大寫
  • 標識符,在_t端類型
規則中的

0
votes
answers
25 views
+10

如何重用函數簽名定義打字稿

2

我有下面的代碼:如何重用函數簽名定義打字稿

class A { 
    constructor(public n: number) {} 

    defaultFn(a: number): number { 
    return a + 1; 
    } 

    doStuff(callback?): number { 
    return callback ? callback(this.n) : this.defaultFn(this.n); 
    } 
} 

我怎麼能告訴打字稿的可選callback功能傳遞給doStuff方法應該具有相同的簽名defaultFn方法?

+0

https://stackoverflow.com/questions/13137350/defining-typescript-callback-鍵入 – Slai

沙发
0
2
interface Callback { 
    (n:number):number; 
} 

class A { 
    constructor(public n: number) { } 

    public readonly defaultFn: Callback = (a: number): number => { 
     return a + 1; 
    } 

    public doStuff(callback?: Callback): number { 
     return callback ? callback(this.n) : this.defaultFn(this.n); 
    } 
} 

你也可以簡單地做到這一點

doStuff(callback?: (n:number)=>number): number { 
    return callback ? callback(this.n) : this.defaultFn(this.n); 
} 

或與接口

interface Callback { 
    (n:number):number; 
} 

doStuff(callback?: Callback): number { 
    return callback ? callback(this.n) : this.defaultFn(this.n); 
} 
+0

謝謝!有一個問題 - 我是否必須重複'defaultFn'的類型定義?你寫了'defaultFn:Callback =(a:number):number' - 指定'Callback'和'(a:number):number'是不是多餘的?如果我將參數名稱形式'a'重命名爲'n',它可以簡化,因爲它是在'Callback'接口中聲明的? – szimek

+0

@szimek噢,你肯定可以刪除類型規範,只是把它變成類方法而不是字段。重命名這個參數並不會有任何不同,它只是一個參數的名字,沒什麼其他的。 – smac89

+0

@szimek我使用這個類型的原因是爲了讓讀者更加明白'defaultFn'與回調類型相同,也減少了編譯時間。這是靜態打字的美妙之處。 – smac89

板凳
0
1

還有一個選項是 「查詢」 型的defaultFn結合起來。在這種情況下,你將不再需要手工維護回調的類型:

class A { 
    constructor(public n: number) {} 

    defaultFn(a: number): number { 
     return a + 1; 
    } 

    doStuff(callback?: A['defaultFn']): number { 
     return callback ? callback(this.n) : this.defaultFn(this.n); 
    } 
} 

A['deafultFn']結果是(a: number) => number

0
votes
answers
60 views
+10

Angular 5的HttpClient:toPromise()接受哪些參數?

0

如果我試圖返回一個特定類型的這樣一個承諾:Angular 5的HttpClient:toPromise()接受哪些參數?

public myMethod(): Promise<MyType> { 
    return this.httpClient.get('/my/url').toPromise(); 
} 

...我得到一個錯誤的返回類型無極<對象>不符合預期的類型無極<的MyType >。這是很容易通過將結果或通過這樣來解決:

public myMethod(): Promise<MyType> { 
    return this.httpClient.get<MyType>('/my/url').toPromise(); 
} 

還有另一種選擇,但是,爲了提供一個可選的參數給toPromise()函數。我的IDE說參數的類型是「PromiseCtor:PromiseConstructorLike」或「PromiseCtor:typeof Promise」。

public myMethod(): Promise<MyType> { 
    return this.httpClient.get('/my/url').toPromise(???); 
} 

我想不通什麼語法會滿足???上面,但是。

關於什麼可以作爲一個有效的參數在這裏填寫任何想法?

+0

我認爲這是要求輸入['Promise'構造(https://developer.mozilla.org/en-US/docs/網絡/ JavaScript的/參考/ Global_Objects /無極)。這可以是本地的,也可以是您最喜歡的承諾庫提供的。這不會幫助你用'MyType',順便說一句。 – Bergi

+0

假設您有特殊類型的承諾MyPromise,您可以傳遞該類型(即MyPromise的構造函數)。目標不是解決你的問題。目標也是返回一個特定類型的Promise。 –

沙发
0
0

您需要首先將返回數據映射到您的對象。

public myMethod(): Promise<MyType> { 
    return this.httpClient.get('/my/url') 
    .map(response => <MyType>response.json()) 
    .toPromise(); 
} 
+0

這看起來像你現在不推薦使用的HttpModule,而不是新的HttpClientModule。當我切換到HttpClientModule時,我從地圖代碼中取出了地圖功能,而且沒有它,我的代碼就可以正常工作。 – kshetline

板凳
0
0

你需要指定喜歡的類型:

`public myMethod(): Promise<MyType> { 
return this.httpClient.get<MyType>('/my/url').toPromise().then((res) => { 
// code goes here. 
}); 
}` 
0
votes
answers
47 views
+10

如何在TypeScript中使用React,Redux進行API調用

0

我使用typescript-fsatypescript-fsa-reducers包簡單地在TypeScript React應用程序中創建動作和縮減器。如何在TypeScript中使用React,Redux進行API調用

const actionCreator = actionCreatorFactory(); 

export function signInHandler(state: UserState, action: Action): UserState { 
    // ???? 

    return { ...state }; 
} 

export const signIn = actionCreator.async<SignInRequest, RequestResponse<SignInResponse>>("USER_SIGNIN"); 

export const UserReducer = reducerWithInitialState({ signedIn: false } as UserState) 
    .casesWithAction([signIn.started, signIn.done], signInHandler) 
    .build(); 

用法在組件:

export default connect<StateProps, DispatchProps>(
    (state: RootState) => ({} as StateProps), 
    (dispatch: Dispatch<RootState>) => { 
    return { 
       signIn: (userName: string, password: string) => dispatch(signIn.started(new SignInRequest(userName, password))) 
    }; 
    } 
)(SignIn); 

現在我卡住了。我不知道如何對我的API進行HTTP調用,以便在API響應到達時,組件分派調度下一個動作時發送請求。我想用承諾。 如何解決?

+0

你見過'typescript-fsa'中的異步操作文檔嗎? https://github.com/aikoven/typescript-fsa#async-action-creators –

+0

是的,但我不知道應該在哪裏進行API調用。行動,行動創造者還是減速器?我想看一個例子 – micnyk

沙发
0
1

在沒有typescript-fsa抽象的React中,您會在動作創建者級別上創建異步API調用,因爲動作只是分派了POJO和減速器應該沒有任何副作用。

有兩個項目很容易做到這一點,redux-thunkredux-saga。我更喜歡redux-thunk,因爲它更容易纏繞頭部。基本上,你的行動的創作者獲得通過的dispatch功能,然後他們可以負責調度不止一件事......像這樣:

function asyncActionCreator(dispatch) { 
    dispatch(startAsyncAction()); 

    doSomethingAsync() 
    .then(result => dispatch(completeAsyncAction(result)) 
    .catch(err => dispatch(errorAsyncAction(err)); 
} 

在你typescript-fsa的世界裏,也有一些同伴包爲這兩種: typescript-fsa-redux-thunktypescript-fsa-redux-saga

看起來typescript-fsa-redux-thunk採用與上述示例類似的方法,使用「動作工作者」的概念,該動作工作者通過typescript-fsa協調動作的分派。有這樣做on the typescript-fsa-redux-thunk回購的一個很好的例子。

0
votes
answers
40 views
+10

在TypeScript中返回不同類型的數組

0

在TypeScript 2.5.3中,我有一堆selenium WebElements,它們是鏈接。我需要在一個字符串數組中獲取它們的目標。從C#Caming我會使用Linq與.Select()本身返回選擇器返回類型的列表。在打字稿這似乎並沒有這麼好工作:在TypeScript中返回不同類型的數組

let categoryLinkElements = await this.driver.findElements(By.css('ul li a')); 
    let categoryLinks = categoryLinkElements.filter(async linkElement => await linkElement.getAttribute('href')); 

categoryLinkElementsWebElement數組。 linkElement.getAttribute('href')返回Promise<string>。原因使用await,我期望categoryLinks是一個字符串數組,就像在C#中List.Select()的行爲一樣。相反,categoryLinksWebElement[]

爲什麼?我怎樣才能獲得正確的返回值?

+1

..如果在href的是你應該使用地圖。現在你只是過濾出有href falsy的元素。 – toskv

沙发
0
0

Array.filter在這裏看起來不對,它應該用來返回與輸入數組相同的值,但是有一些過濾條件。相反,Array.map是C#中List.Select的正確等效項。

預期以下工作:

let categoryLinks = categoryLinkElements.map(async linkElement => await linkElement.getAttribute('href')); 

由於打字稿和JavaScript的初學者來說,這似乎是一個愚蠢的問題之後...對不起:您使用的過濾器/

+1

這裏要小心'categoryLinks'將是'Promise '而不是'string'的數組; – JKillian

+0

@JKillian是正確的,你應該添加一個調用來減少 –

0
votes
answers
32 views
+10

是否可以在Typescript中動態定義常量?

1

我想找到一種方法來在Typescript中動態定義一個常量,但是我開始做這件事是不可能的。是否可以在Typescript中動態定義常量?

我嘗試這樣做:

define(name: string, value: any): boolean { 
    var undef; 
    const name = value; 
    return name == undef; 
    } 

我應該撥打:

define ('MY_CONST_NAME', 'foo_value); 

我收到以下錯誤:

Duplicate 'name' identifier. 

我認爲這是正常的,但我不知道如何實現我的目標。

+3

你收到這個錯誤,因爲你有一個函數參數:然而,它是淺的,所以除非你想凍結它遞歸(小心)或路徑

From the MDN上的深刻變化將是一個問題和一個同名的局部變量。使用不同的名稱,或者說明你想要完成什麼 –

+1

我們需要更多的上下文(例如,你會怎麼稱呼'define')。這裏錯誤是正常的,你在函數參數和範圍內定義了'name'。 – ValLeNain

+0

我明白了,但我只是想在我的函數中創建一個常量並返回一個布爾值,如果我成功與否 – DMCISSOKHO

沙发
0
1

簡而言之編號Const是塊範圍。當宣佈它變得可用時,直到那時。如果你想聲明一些不可變的東西並不難,但這個問題可能表明缺乏知識。我認爲你可能會發現更有用的是如何深度凍結一個對象,以便無法添加,刪除或更改對象。

var obj = { 
    prop: function() {}, 
    foo: 'bar' 
}; 

// New properties may be added, existing properties may be 
// changed or removed 
obj.foo = 'baz'; 
obj.lumpy = 'woof'; 
delete obj.prop; 

// Both the object being passed as well as the returned 
// object will be frozen. It is unnecessary to save the 
// returned object in order to freeze the original. 
var o = Object.freeze(obj); 

o === obj; // true 
Object.isFrozen(obj); // === true 

// Now any changes will fail 
obj.foo = 'quux'; // silently does nothing 
// silently doesn't add the property 
obj.quaxxor = 'the friendly duck'; 

// In strict mode such attempts will throw TypeErrors 
function fail(){ 
    'use strict'; 
    obj.foo = 'sparky'; // throws a TypeError 
    delete obj.quaxxor; // throws a TypeError 
    obj.sparky = 'arf'; // throws a TypeError 
} 

fail(); 

// Attempted changes through Object.defineProperty; 
// both statements below throw a TypeError. 
Object.defineProperty(obj, 'ohai', { value: 17 }); 
Object.defineProperty(obj, 'foo', { value: 'eit' }); 

// It's also impossible to change the prototype 
// both statements below will throw a TypeError. 
Object.setPrototypeOf(obj, { x: 20 }) 
obj.__proto__ = { x: 20 } 
+0

啊啊謝謝你:「這個問題表明缺乏可能的知識」,順便說一句,這是一個很好的答案,我很確定我正在嘗試一些不可能的事情。 – DMCISSOKHO

0
votes
answers
66 views
+10

錯誤:未捕獲(承諾中):TypeError:無法讀取未定義的屬性「映射」

1

僅當它嘗試從catch返回值時,纔會發生以下錯誤。希望我在這裏做一個根本錯誤的事情。請給我一個線索。爲什麼我不能從catch返回observable錯誤:未捕獲(承諾中):TypeError:無法讀取未定義的屬性「映射」

.TS

getMyTopic() { 
    return this.topicSer.getMyTopics().map((res: any) => res.json()).map((res: any) => res = res.categories) 
     .catch((err: any) => { 
     console.log('err', err); 
     return [] 
     }) 
    }  

provider.ts

getMyTopics(): Observable<any> { 
     if (typeof this.userService.userDetails != 'undefined') { 
      this.localCacheService.getItem(this.localCacheService.discoverTopicsKey).then((val) => { 
     if (val != null && val.length == 0) return this.apiService.get(config.discover_topic_WITHAUTH); 
     }).catch(() => { 
     return this.apiService.get(config.discover_topic_WITHOUTAUTH);//here is the issue 
      }); 
     } 

錯誤

ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'map' of undefined 
TypeError: Cannot read property 'map' of undefined 
    at Discover.webpackJsonp.402.Discover.getMyTopic (discover.ts:123) 
    at Discover.webpackJsonp.402.Discover.getData (discover.ts:69) 
    at discover.ts:51 
    at t.invoke (polyfills.js:3) 
    at Object.onInvoke (core.js:4626) 
    at t.invoke (polyfills.js:3) 
    at r.run (polyfills.js:3) 
    at polyfills.js:3 
    at t.invokeTask (polyfills.js:3) 
    at Object.onInvokeTask (core.js:4617) 
    at Discover.webpackJsonp.402.Discover.getMyTopic (discover.ts:123) 
    at Discover.webpackJsonp.402.Discover.getData (discover.ts:69) 
    at discover.ts:51 
    at t.invoke (polyfills.js:3) 
    at Object.onInvoke (core.js:4626) 
    at t.invoke (polyfills.js:3) 
    at r.run (polyfills.js:3) 
    at polyfills.js:3 
    at t.invokeTask (polyfills.js:3) 
    at Object.onInvokeTask (core.js:4617) 
    at c (polyfills.js:3) 
    at polyfills.js:3 
    at t.invokeTask (polyfills.js:3) 
    at Object.onInvokeTask (core.js:4617) 
    at t.invokeTask (polyfills.js:3) 
    at r.runTask (polyfills.js:3) 
    at o (polyfills.js:3) 
    at e.invokeTask [as invoke] (polyfills.js:3) 
    at p (polyfills.js:2) 
    at IDBRequest.v (polyfills.js:2) 
defaultErrorLogger @ core.js:1350 
ErrorHandler.handleError @ core.js:1411 
IonicErrorHandler.handleError @ ionic-error-handler.js:61 
next @ core.js:5373 
schedulerFn @ core.js:4220 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:238 
SafeSubscriber.next @ Subscriber.js:185 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subject.next @ Subject.js:55 
EventEmitter.emit @ core.js:4200 
(anonymous) @ core.js:4648 
t.invoke @ polyfills.js:3 
r.run @ polyfills.js:3 
NgZone.runOutsideAngular @ core.js:4574 
onHandleError @ core.js:4648 
t.handleError @ polyfills.js:3 
r.runGuarded @ polyfills.js:3 
(anonymous) @ polyfills.js:3 
n.microtaskDrainDone @ polyfills.js:3 
o @ polyfills.js:3 
e.invokeTask @ polyfills.js:3 
p @ polyfills.js:2 
v @ polyfills.js:2 
IndexedDB (async) 
(anonymous) @ localforage.js:826 
t.invoke @ polyfills.js:3 
onInvoke @ core.js:4626 
t.invoke @ polyfills.js:3 
r.run @ polyfills.js:3 
(anonymous) @ polyfills.js:3 
t.invokeTask @ polyfills.js:3 
onInvokeTask @ core.js:4617 
t.invokeTask @ polyfills.js:3 
r.runTask @ polyfills.js:3 
o @ polyfills.js:3 
e.invokeTask @ polyfills.js:3 
p @ polyfills.js:2 
v @ polyfills.js:2 
沙发
0
0

getMyTopics方法不會返回任何內容。當catch運算符返回一個Observable時,它將返回一個空數組。