🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TypeScript

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

Q&A

解決済

1回答

458閲覧

型の特定と継承について

TOMIYASU_chan

総合スコア21

TypeScript

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

0グッド

1クリップ

投稿2019/09/20 01:46

エラーの様子

TypeScriptハンドブックで見た例でよくわからなかったエラーがありましたが
いずれもう少し読みすすめていけばわかるようになるだろうと思って
放置していた疑問についておしえてください

他にも例はあるのですが最初に私の環境でこの種のエラーメッセージが出たのは
以下の[交差型の説明]のサンプルでした

TypeScript

1function extend<T, U>(first: T, second: U): T & U { 2 let result = <T & U>{}; 3 for (let id in first) { 4 (<any>result)[id] = (<any>first)[id]; 5 } 6 for (let id in second) { 7 if (!result.hasOwnProperty(id)) { // [Error] 'hasOwnProperty' は型 'T & U' に存在しません。ts(2339) 8 (<any>result)[id] = (<any>second)[id]; 9 } 10 } 11 return result; 12} 13

上記のresultは2つの型引数で交差型として特定されおり、
その型においてhasOwnPropertyプロパティーは無いというエラーです
ましてやまだ未定のTとUであるわけですから当然なのですが・・・
もちろんresultの宣言から型を取り去ればこのエラーはなくなります

###疑問点
TypeScriptにおいて、型を特定した途端にいわゆるJavaScriptとしての継承は断ち切られれるのだろうか?

そうであるならTypeScriptとして、このようなケースで(JavaScriptとしての、自分や親のプロパティーにアクセスしたい時など)、どのようにすればエラーなくできるでしょうか?

またハンドブックのサンプルでこのようなエラーメッセージがでるのは
私のリンターなど環境の設定がおかしいのか?

など、全く理解が足りてないのですがよろしくおねがします。

環境

VS Code 1.38.1
WebPack 4.16.3
WebPackCLI 3.1.0
typescript 3.2.4
ts-loader 4.4.2"
eslint 5.14.0

tsconfig.json

JSON

1{ 2 "compilerOptions": { 3 "target": "es6", 4 "module": "commonjs", 5 "strict": true, 6 "strictNullChecks": true, 7 "esModuleInterop": true, 8 "sourceMap": true, 9 "outDir": "./dist/js/", 10 "rootDir": "./src/ts/", 11 "lib": ["es6", "dom", "es2018"], 12 "typeRoots": ["./typings"], 13 "strictFunctionTypes": false, 14 }, 15}

.eslintrc.js

JavaScript

1module.exports = { 2 "ecmaFeatures": { 3 "modules": true 4 }, 5 "env": { 6 "browser": true, 7 "node" : true, 8 "es6" : true, 9 "mocha":true, 10 "jquery": true 11 }, 12 "extends": [ 13 "eslint:recommended", 14 "plugin:prettier/recommended" 15 ], 16 "plugins": [ 17 "@typescript-eslint" 18 ], 19 "globals": { 20 }, 21 "parser": "@typescript-eslint/parser", 22 "parserOptions": { 23 "sourceType": "module", 24 "project": "./tsconfig.json" 25 }, 26 "settings":{ 27 'import/extensions': ['.js','jsx','.ts','tsx'], 28 'import/resolver':{'node':['.js','jsx','.ts','tsx']} 29 }, 30 "rules": { 31 "no-console": "off", 32 "no-irregular-whitespace":'off', 33 "no-extra-semi": "warn", 34 "no-undef": "warn", 35 "quotes": ["warn", "single"], 36 "space-before-blocks": ["warn", { "functions": "always" }], 37 "@typescript-eslint/adjacent-overload-signatures": "error", 38 "no-unused-vars":"off", 39 "prettier/prettier": [ 40 "error", 41 { 42 "singleQuote": true, 43 "trailingComma": "es5", 44 "semi": false, 45 }, 46 ], 47 }, 48} 49コード

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/09/20 01:48

エラーを貼って下さい(貴方の解釈ではなく実物)。
guest

回答1

0

ベストアンサー

TypeScriptにおいて、型を特定した途端にいわゆるJavaScriptとしての継承は断ち切られれるのだろうか?

そういうのとは関係なく、これはコードの書き方が悪いです。実際にTUObject.create(null)などで作ったhasOwnPropertyのないオブジェクトを渡せる以上、result.hasOwnProperty呼べないこともある前提で書く必要があります。T & U型にhasOwnPropertyがあることは保証されません。

さらに言えば、TUに関数でないhasOwnPropertyがセットしてあるという危険性も考えると、result.hasOwnPropertyに頼るのは適当ではありません。Object.prototype.hasOwnProperty.callを使ってください(これはTypeScriptでないJavaScriptを書く際にも共通します)。

投稿2019/09/20 01:52

編集2019/09/20 01:56
maisumakun

総合スコア145975

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

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

TOMIYASU_chan

2019/09/20 02:25 編集

ありがとうございます。 「T & U型にhasOwnPropertyがあることは保証されません」というところで納得できました 可能性として無いかもしれない部分に関してのエラーということですね これなら何度も出会った表現で、意味的にも理解できます !Object.prototype.hasOwnProperty.call(result, id)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問