不明な点
以下のfilterByTerm関数内のif文でstringの型ガードが効いて
matchメソッドも使えると考えているのですが、実際はエラーになり
型はインターフェイスでの定義のままの ’string | number ’ となっていて
matchメソッドが無いというエラーが発生しています
これは何が原因なのでしょうか?
TypeScript
1interface Link { 2 description?: string 3 id?: number 4 url: string 5 [index: string]: string | number | undefined 6} 7 8function filterByTerm( 9 input: Array<Link>, 10 searchTerm: string, 11 lookupKey: string = 'url' 12): Array<Link> { 13 if (!searchTerm) throw Error('searchTerm cannot be empty') 14 if (!input.length) throw Error('input cannot be empty') 15 const regex = new RegExp(searchTerm, 'i') 16 return input.filter(function(arrayElement) { 17 if (typeof arrayElement[lookupKey] === 'string') { 18 return arrayElement[lookupKey]!.match(regex) // <-Error 19 } 20 }) 21} 22 23let res = filterByTerm( 24 [{ url: 'string1' }, { url: 'string2' }, { url: 'string3' }], 25 'string3' 26) 27console.log(res)
ErrorMessage
1プロパティ 'match' は型 'string | number' に存在しません。 2 プロパティ 'match' は型 'number' に存在しません。ts(2339)
tsconfig
1{ 2 "compilerOptions": { 3 "target": "es2016", 4 "module": "commonjs", 5 "strict": true, 6 "strictNullChecks": true, 7 "esModuleInterop": true, 8 "declaration": true, 9 "sourceMap": false, 10 "outDir": "./dist/js/" /* Redirect output structure to the directory. */, 11 "rootDir": "./src/", 12 "lib": ["es6", "dom", "es2018", "es2015.iterable","scripthost"], 13 "downlevelIteration": true, 14 "baseUrl": "./", 15 "typeRoots": [ 16 "node_modules/@types", 17 "types/index"], 18 "strictFunctionTypes": false, 19 }, 20}
環境
VS Code 1.41.1
WebPack 4.41.5
typescript 3.7.4
ts-loader 6.2.1
eslint 6.8.0
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/19 03:59 編集