簡體   English   中英

Typescript strictNullChecks和數組

[英]Typescript strictNullChecks and arrays

我沒有完全理解Typescript在啟用編譯器選項strictNullChecks的行為。 似乎有時Typescript(版本2.4.1)理解string[]string ,有時它不是:

interface MyMap {
    [key: string]: string[];
}

function f(myMap: MyMap) {
    const keys = Object.keys(myMap); // keys: string[] => Fine.
    for (let key of keys) { // key: string | undefined => Why?
        key = key as string // So a cast is needed.
        const strings = myMap[key]; // strings: string[] => Fine.
        const s = strings[0]; // s: string => Fine.

        // Error:
        // Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
        // Type 'undefined' is not assignable to type 'string'.
        useVarArgs(...strings);
    }
}
function useVarArgs(...strings: string[]) {
}

更新2017-07-14:

只有在使用downlevelIteration時才會觀察到這種奇怪的行為。 我的tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "outDir": "target",
    "downlevelIteration": true,
    "strictNullChecks": true
  }
}

經過進一步調查,我可以確認這不是打字稿問題。 問題的起源是用於IteratorResult<T>的類型。 我使用過@types/core-js 0.9.36

interface IteratorResult<T> {
    done: boolean;
    value?: T;
}

value是可選的,這在技術上是正確的,因為根據迭代器協議value “完成時可以省略”。 正如我的問題所證明的那樣,選擇性在實踐中並沒有用。

使用Typescript附帶的類型(在tsconfig.json的“lib”部分中配置的“es2015”,即文件lib.es2015.iterable.d.ts )采用更實用的方法,顯然假設在done時不會使用該valuetrue

interface IteratorResult<T> {
    done: boolean;
    value: T;
}

為了解決這個問題,您可以編輯@types/core-js或將其替換為Typescript附帶的庫。 但是,替換不是100%等效 - 請查看此問題進行討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM