Saya baru mengenal ketikan, dan saya memiliki dua kelas. Di kelas orang tua saya memiliki:
abstract class Component {
public deps: any = {};
public props: any = {};
public setProp(prop: string): any {
return <T>(val: T): T => {
this.props[prop] = val;
return val;
};
}
}
Di kelas anak saya memiliki:
class Post extends Component {
public toggleBody: string;
constructor() {
this.toggleBody = this.setProp('showFullBody');
}
public showMore(): boolean {
return this.toggleBody(true);
}
public showLess(): boolean {
return this.toggleBody(false);
}
}
Baik showMore dan ShowLess memberi saya kesalahan, "Tidak dapat memanggil ekspresi yang tipenya tidak memiliki tanda tangan panggilan."
Tetapi fungsi yang dikembalikan setProp APAKAH memiliki tanda tangan panggilan, menurut saya? Saya pikir saya salah paham tentang sesuatu yang penting tentang pengetikan fungsi, tetapi saya tidak tahu apa itu.
Terima kasih!
javascript
angularjs
typescript
types
Justin
sumber
sumber
togglrBody
tidak boleh berupa string, karena Anda menginginkannya menjadi fungsi<T>(val: T) => T
Jawaban:
Fungsi yang dikembalikannya memiliki tanda tangan panggilan, tapi Anda memberi tahu Ketikan untuk mengabaikannya sepenuhnya dengan menambahkan
: any
tanda tangannya.Jangan lakukan itu.
sumber
public toggleBody: boolean;
untukpublic toggleBody: any;
bekerja.this.toggleBody
harus mengembalikanboolean
, tapi itu tidak konsisten dengan nilai pengembaliansetProp
yang Anda tetapkan padanya. Anda tampaknya hanya memasukkan huruf secara acak tanpa memikirkan tentang apa yang sebenarnya ingin Anda kirim dan kembalikan.Dalam kode Anda:
Anda punya
public toggleBody: string;
. Anda tidak dapat memanggilstring
sebagai fungsi. Karenanya kesalahan pada:this.toggleBody(true);
danthis.toggleBody(false);
sumber
Mari kita uraikan ini:
Kesalahan mengatakan
Kode:
Masalahnya ada di baris ini
public toggleBody: string;
&itu terkait dengan baris ini:
Pepatah Anda
toggleBody
adalah astring
tetapi kemudian Anda memperlakukannya seperti sesuatu yang memilikicall signature
(yaitu struktur dari sesuatu yang dapat disebut: lambda, proc, functions, methods, dll. Dalam JS hanya berfungsi tho.). Anda perlu mengubah deklarasi menjadipublic toggleBody: (arg: boolean) => boolean;
.Detail Ekstra:
"memanggil" berarti Anda memanggil atau menerapkan suatu fungsi.
"ekspresi" dalam Javascript pada dasarnya adalah sesuatu yang menghasilkan nilai, jadi
this.toggleBody()
dihitung sebagai ekspresi."type" dideklarasikan di baris ini
public toggleBody: string
"kekurangan tanda tangan panggilan" ini karena Anda mencoba memanggil sesuatu
this.toggleBody()
yang tidak memiliki tanda tangan (yaitu struktur dari sesuatu yang dapat disebut: lambda, proc, fungsi, metode, dll.) yang dapat dipanggil. Anda mengatakanthis.toggleBody
sesuatu yang bertindak seperti tali.Dengan kata lain kesalahan mengatakan
sumber
Saya pikir yang Anda inginkan adalah:
Perubahan penting ada di
setProp
(yaitu,makePropSetter
dalam kode baru). Apa yang sebenarnya Anda lakukan di sana adalah mengatakan: ini adalah fungsi, yang disediakan dengan nama properti, akan mengembalikan fungsi yang memungkinkan Anda mengubah properti itu.The
<T>
onmakePropSetter
memungkinkan Anda untuk mengunci fungsi yang ke jenis tertentu. The<boolean>
dalam konstruktor subclass ini sebenarnya opsional. Karena Anda sedang menugaskan ketoggleBody
, dan itu sudah memiliki tipe yang ditentukan sepenuhnya, kompiler TS akan dapat mengerjakannya sendiri.Kemudian, di subclass Anda, Anda memanggil fungsi itu, dan tipe kembalian sekarang dipahami dengan benar sebagai fungsi dengan tanda tangan tertentu. Tentu, Anda harus
toggleBody
menghormati tanda tangan yang sama itu.sumber
Artinya Anda mencoba memanggil sesuatu yang bukan fungsi
sumber
Tambahkan tipe ke variabel Anda dan kemudian kembali.
Misalnya:
=> Bagian penting adalah menambahkan string [] type dll:
sumber
Saya mendapat pesan kesalahan yang sama. Dalam kasus saya, saya secara tidak sengaja mencampur
export default function myFunc
sintaks ES6 denganconst myFunc = require('./myFunc');
.Menggunakan
module.exports = myFunc;
malah memecahkan masalah.sumber
Kesalahan ini dapat terjadi saat Anda meminta nilai dari sesuatu dan Anda meletakkan tanda kurung di akhir, seolah-olah itu adalah panggilan fungsi, namun nilainya diambil dengan benar tanpa mengakhiri tanda kurung. Misalnya, jika yang Anda akses adalah Properti 'dapatkan' di Skrip Ketik.
sumber