ละเว้นข้อผิดพลาด "คุณสมบัติไม่ได้อยู่ที่ค่าของประเภท"


227

ในการสร้าง VS2013 หยุดเมื่อ tsc ออกด้วยรหัส 1 นี่ไม่ใช่กรณีใน VS2012

ฉันจะรันโซลูชันของฉันในขณะที่ละเว้นข้อผิดพลาด tsc.exe ได้อย่างไร

ฉันพบThe property 'x' does not exist on value of type 'y'ข้อผิดพลาดมากมายซึ่งฉันต้องการเพิกเฉยเมื่อใช้ฟังก์ชั่นจาวาสคริปต์

คำตอบ:


303

ฉันรู้ว่าคำถามถูกปิดไปแล้ว แต่ฉันพบว่ามันกำลังค้นหา TypeScriptException ที่เหมือนกันบางทีอาจมีบางคนที่เจอคำถามนี้เพื่อค้นหาปัญหานี้

ปัญหาวางในการพิมพ์ TypeScript ที่ขาดหายไป:

var coordinates = outerElement[0].getBBox();

พ่น The property 'getBBox' does not exist on value of type 'HTMLElement'.


วิธีที่ง่ายที่สุดคือพิมพ์ตัวแปรอย่างชัดเจน any

var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();

แก้ไขช่วงปลายปี 2016

ตั้งแต่ TypeScript 1.6 ที่ต้องการตัวดำเนินการแคสต์เป็นasเส้นที่สามารถ squqshed เป็นสง่า:

let coordinates = (outerElement[0] as any).getBBox();


โซลูชั่นอื่น ๆ

แน่นอนถ้าคุณต้องการทำถูกต้องซึ่งเป็น overkill บางครั้งคุณสามารถ:

  1. สร้างส่วนต่อประสานของตัวเองซึ่งขยายออกไป HTMLElement
  2. แนะนำการพิมพ์ของตัวเองซึ่งขยาย HTMLElement

14
คุณสามารถสร้างอินเทอร์เฟซที่ขยายHTMLElementและมีgetBBoxคุณสมบัติเพิ่มเติมได้ วิธีนี้คุณจะยังคงได้รับโค้ดที่สมบูรณ์ในคุณสมบัติอื่น ๆ
thetallweeks

แทนที่จะgetBBoxใช้วิธีใดในการหล่ออย่างเหมาะสม? ชอบที่จะหาประเภทของgetBBox?
Pardeep Jain

FE: ถ้าgetBBoxจะอยู่ในประเภทที่คุณสามารถโยนวัตถุที่มันด้วยHTMLElement var typedElement = <HTMLElement> outerHtmlElement;
michalczukm

4
ดี! var coordinates = (<any>outerElement[0]).getBBox();
bowpunya

1
อันที่จริงไม่ตอบคำถาม: "วิธีการข้อผิดพลาด IGNORE"
Petr Peller

121

ทางออกที่รวดเร็วและสกปรกคือการส่งไปยังอย่างชัดเจน any

(y as any).x

"ความได้เปรียบ" คือการส่งสัญญาณจะชัดเจนแม้จะมีการnoImplicitAnyตั้งค่าสถานะ

ทางออกที่เหมาะสมคือการอัพเดตไฟล์นิยามการพิมพ์

โปรดทราบว่าเมื่อคุณแปลงตัวแปรเป็นanyคุณจะไม่ใช้การตรวจสอบชนิดสำหรับตัวแปรนั้น


เนื่องจากฉันอยู่ในโหมดปฏิเสธความรับผิดชอบการร่ายคู่ผ่านทางanyรวมกับส่วนต่อประสานใหม่จะมีประโยชน์ในสถานการณ์ที่คุณ

  • ไม่ต้องการอัปเดตไฟล์การพิมพ์ที่ใช้งานไม่ได้
  • กำลังทำการปะของลิง

แต่คุณยังต้องการรูปแบบการพิมพ์บางอย่าง

สมมติว่าคุณต้องการแพทช์คำจำกัดความของอินสแตนซ์yของประเภทOrginalDefด้วยคุณสมบัติใหม่xของประเภทnumber:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile

ขอบคุณที่ช่วย: import http = ต้องการ ('http'); เซิร์ฟเวอร์ var = http เป็นใด ๆ ; server.Server (app); // ละเว้นข้อผิดพลาด ts!
ภูมิประเทศ

ฉันใช้สิ่งนี้ใน "ตรวจสอบให้แน่ใจว่าคุณสมบัติไม่พบใน NodeRequire" ดังนั้นฉันประกาศของฉันต้องการตัวแปรใน NodeRequired และ (ต้องการเป็นใด ๆ ). มั่นใจสำหรับคุณสมบัติ หวังว่านี่จะช่วยได้
Juni Brosas

61

คุณยังสามารถใช้เคล็ดลับต่อไปนี้:

y.x = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

ทราบว่าในการเข้าถึงxและไม่ได้รับข้อผิดพลาด typescript อีกครั้งคุณจะต้องเขียนเช่นนั้นไม่y["x"] y.xดังนั้นจากมุมมองนี้ตัวเลือกอื่นจะดีกว่า


4
ไม่มีใครรู้ว่าทำไมงานนี้และหากมีเครือข่ายที่อาจเกิดขึ้นหรือผลประโยชน์ในช่วงแรกประกาศวัตถุเป็น:any?
mcheah

มันจะมีประโยชน์ชัดเจนในการเก็บรักษาแบบพิมพ์ ฉันอยากจะรู้ว่าทำไมสิ่งนี้ถึงไม่ส่งสัญญาณเตือน แต่การเข้าถึงโดยตรงจะทำได้ ..
Powderham

38

มีหลายวิธีในการจัดการปัญหานี้ หากวัตถุนี้เกี่ยวข้องกับห้องสมุดภายนอกบางส่วนทางออกที่ดีที่สุดคือการหาไฟล์คำจำกัดความที่แท้จริง (ที่เก็บที่ดีที่นี่ ) สำหรับห้องสมุดนั้นและอ้างอิงมันเช่น:

/// <reference path="/path/to/jquery.d.ts" >

แน่นอนว่ามันใช้ไม่ได้กับหลาย ๆ กรณี

หากคุณต้องการ 'แทนที่' ระบบประเภทลองต่อไปนี้:

declare var y;

นี้จะช่วยให้คุณโทรใด ๆ var yที่คุณต้องการบน


5
ควรจะ/// <reference path="/path/to/jquery.d.ts" />มีแท็กปิดตัวเองในตอนท้าย
Tic

ฉันใช้ VS2015 และทำตามบทช่วยสอนนี้สำหรับเชิงมุมฉันไม่มีjquery.d.tsไฟล์ในโครงการของฉัน
Dimple

@Dimple npm install -g tsdแล้วtsd install jquery
Akash

ตัวเลือกที่สอง (ประกาศ var y) ใช้งานได้ดีถ้าคุณย้ายจาก JavaScript ไปยัง TypeScript และต้องการแก้ไขข้อผิดพลาด avoi TS2304 เนื่องจาก JavaScript เก่าของคุณอ้างอิงตัวแปรในไฟล์ JavaScript อื่น
yesman

ขอบคุณ! สำหรับฉันปัญหาอยู่กับ Jest, const mockPrompt: any = jest.spyOn (ขั้นตอน, 'พร้อมท์');
Mark Robson

18

เมื่อ TypeScript คิดว่าคุณสมบัติ"x"ไม่มีอยู่ใน"y"คุณสามารถแปลง "y" เป็น "any" ซึ่งจะช่วยให้คุณสามารถโทรหาอะไรก็ได้ (เช่น "x") บน "y"

ทฤษฎี

(<any>y).x;

ตัวอย่างโลกแห่งความจริง

ฉันได้รับข้อผิดพลาด "TS2339: คุณสมบัติ 'ชื่อ' ไม่มีอยู่ในประเภท 'ฟังก์ชั่น'" สำหรับรหัสนี้:

let name: string = this.constructor.name;

ดังนั้นฉันจึงแก้ไขด้วย:

let name: string = (<any>this).constructor.name;

1
ใช้งานไม่ได้กับสุดยอด หากคุณขยายชั้นเรียนโดยใช้การพิมพ์และผู้แต่งลืมวิธีการแบบสาธารณะคุณเมามาก คุณต้องเพิ่มลงในการกำหนดประเภทซึ่งจะหยุดในการติดตั้ง npm ถัดไปบังคับให้คุณสร้างคำขอดึงหรือแจ้งผู้เขียนซึ่งอาจเป็นสิ่งที่ดี แต่เจ็บปวด
Corey Alix

15

มีปัญหาใน Angular2 ฉันใช้ที่เก็บข้อมูลในตัวเครื่องเพื่อบันทึกบางสิ่งและมันจะไม่ยอมให้ฉัน

Solutions:

ฉันมี localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

วิธีแก้ไข:

localStorage [ 'เมือง']

(localStorage) .city

(localStorage เป็นใด ๆ ) .city


ตัวเลือกที่สองดูเท่ห์ แต่ดูเหมือนจะไม่ทำงานอีกต่อไป ธิถ้าคุณคำนำหน้าวัตถุที่มี-<any> (<any>localStorage).city
jayarjo

ฉันรู้ว่ามันเก่า แต่ตัวอย่างอันดับต้น ๆ ของคุณใช้ได้สำหรับฉัน .. ทำได้ดีมาก
MacD

4

การแก้ไขอย่างรวดเร็วที่ไม่มีสิ่งใดทำงาน:

const a.b = 5 // error

const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled

const B = 'b'
const a[B] = 5 // always works

ไม่ใช่วิธีปฏิบัติที่ดี แต่มีวิธีแก้ปัญหาโดยไม่จำเป็นต้องปิดไม่มีตัวอักษร


ฉันก็ทำเช่นนี้ แต่บางแพลตฟอร์ม (เช่น Google Cloud) จะเพิ่มข้อความเตือนว่า ab ดีกว่า ['b'] คุณรู้ไหมว่าทำไมถึงเป็นเช่นนี้?
Jonathan

1
ไม่แน่ใจ แต่คุณสามารถทำได้ในตัวอย่างของ tslint.json ให้เปลี่ยนตัวเลือกเพื่อให้มันชอบ ab
danday74

3

ฉันรู้ว่าตอนนี้ปี 2020 แต่ฉันไม่เห็นคำตอบที่พอใจ "ละเว้น" ส่วนหนึ่งของคำถาม ปรากฎว่าคุณสามารถบอก TSLint ให้ทำเช่นนั้นโดยใช้คำสั่ง;

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

โดยปกติจะทำให้เกิดข้อผิดพลาดโดยระบุว่า 'someProp ไม่มีอยู่ในประเภท' ด้วยความคิดเห็นข้อผิดพลาดนั้นจะหายไป

สิ่งนี้จะหยุดข้อผิดพลาดใด ๆ ที่เกิดขึ้นเมื่อทำการรวบรวมและควรหยุด IDE ที่คุณบ่น


0

ในโครงการเฉพาะของฉันฉันไม่สามารถทำงานและใช้งานdeclare var $;ได้ ไม่ใช่โซลูชันที่แนะนำ / สะอาดไม่รู้จักตัวแปร JQuery แต่ฉันไม่มีข้อผิดพลาดหลังจากใช้งานนั้น (และต้องให้การสร้างอัตโนมัติของฉันสำเร็จ)


0

ฉันสามารถผ่านนี้ใน typescript โดยใช้สิ่งที่ชอบ:

let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
    y.set(x[i], //value for this key here);
}

นี่เป็นวิธีเดียวที่ฉันสามารถใช้ค่าภายใน X เป็นปุ่มสำหรับแมป Y และคอมไพล์ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.