Typescript 如何将此函数重写为接口?

Typescript 如何将此函数重写为接口?,typescript,react-native,Typescript,React Native,我的目标是在界面中编写所有内容,即打字脚本。这是给我的 这是我无法放入接口的函数。当前的解决方案是将其放在接口之外,但导入会很难看,例如从“…”导入AudioRecorderModule,{addAudioRecorderEventListener} export const addAudioRecorderEventListener = ( listener: (data: number[]) => void, ) => eventEmitter.addListener('re

我的目标是在界面中编写所有内容,即打字脚本。这是给我的

这是我无法放入接口的函数。当前的解决方案是将其放在接口之外,但导入会很难看,例如从“…”导入AudioRecorderModule,{addAudioRecorderEventListener}

export const addAudioRecorderEventListener = (
  listener: (data: number[]) => void,
) => eventEmitter.addListener('read', listener);
录音机.module.ts

import {NativeEventEmitter, NativeModules} from 'react-native';

import AudioRecorderInterface from './AudioRecorder.d';

const {AudioRecorderModule} = NativeModules;

const eventEmitter = new NativeEventEmitter(AudioRecorderModule);

export const addAudioRecorderEventListener = (
  listener: (data: number[]) => void,
) => eventEmitter.addListener('read', listener);

export default AudioRecorderModule as AudioRecorderInterface;
录音机

export default interface AudioRecorderInterface {
  startAudioRecordingAsync(): Promise<null>;
  stopAudioRecordingAsync(): Promise<null>;
}
导出默认接口AudioRecorder接口{
startAudioRecordingAsync():承诺;
stopAudioRecordingAsync():承诺;
}

我不明白为什么要从
.d.ts
导入。您应该将界面放入
.ts
文件中,并在
生成代码时生成
.d.ts

为了调用
新的NativeEventMitter(AudioRecorderModule)
,模块必须实现
EventSubscriptionVendor
接口

我想这段代码回答了你的问题:

interface AudioRecorderInterface {
  startAudioRecordingAsync(): Promise<null>;
  stopAudioRecordingAsync(): Promise<null>;
  addAudioRecorderEventListener(listener: (data: number[]) => void): EmitterSubscription;
}

const AudioRecorderModule = NativeModules.AudioRecorderModule as AudioRecorderInterface & EventSubscriptionVendor;

const eventEmitter = new NativeEventEmitter(AudioRecorderModule);

AudioRecorderModule.addAudioRecorderEventListener = (
  listener: (data: number[]) => void,
) => eventEmitter.addListener('read', listener);

export default AudioRecorderModule;
接口录音机接口{
startAudioRecordingAsync():承诺;
stopAudioRecordingAsync():承诺;
addAudioRecorderEventListener(监听器:(数据:number[])=>void:EmitterSubscription;
}
const AudioRecorderModule=NativeModules.AudioRecorderModule作为AudioRecorderInterface&EventSubscriptionVendor;
const eventEmitter=新的NativeEventMitter(AudioRecorderModule);
AudioRecorderModule.addAudioRecorderEventListener=(
侦听器:(数据:number[])=>void,
)=>eventEmitter.addListener('read',listener);
导出默认的AudioRecorderModule;

但是请注意,当我们将
用作AudioRecorderInterface&EventSubscriptionVendor
时,我们告诉typescript模块必须实现这些接口。如果模块没有实际实现这些方法,您将遇到问题。

我不明白您为什么要从
.d.ts
导入。您应该将界面放入
.ts
文件中,并在
生成代码时生成
.d.ts

为了调用
新的NativeEventMitter(AudioRecorderModule)
,模块必须实现
EventSubscriptionVendor
接口

我想这段代码回答了你的问题:

interface AudioRecorderInterface {
  startAudioRecordingAsync(): Promise<null>;
  stopAudioRecordingAsync(): Promise<null>;
  addAudioRecorderEventListener(listener: (data: number[]) => void): EmitterSubscription;
}

const AudioRecorderModule = NativeModules.AudioRecorderModule as AudioRecorderInterface & EventSubscriptionVendor;

const eventEmitter = new NativeEventEmitter(AudioRecorderModule);

AudioRecorderModule.addAudioRecorderEventListener = (
  listener: (data: number[]) => void,
) => eventEmitter.addListener('read', listener);

export default AudioRecorderModule;
接口录音机接口{
startAudioRecordingAsync():承诺;
stopAudioRecordingAsync():承诺;
addAudioRecorderEventListener(监听器:(数据:number[])=>void:EmitterSubscription;
}
const AudioRecorderModule=NativeModules.AudioRecorderModule作为AudioRecorderInterface&EventSubscriptionVendor;
const eventEmitter=新的NativeEventMitter(AudioRecorderModule);
AudioRecorderModule.addAudioRecorderEventListener=(
侦听器:(数据:number[])=>void,
)=>eventEmitter.addListener('read',listener);
导出默认的AudioRecorderModule;

但是请注意,当我们将
用作AudioRecorderInterface&EventSubscriptionVendor
时,我们告诉typescript模块必须实现这些接口。如果模块没有实际实现这些方法,您将遇到问题。

我认为我在
d.ts
应该如何工作方面犯了错误。我还尝试了您的解决方案
const AudioRecorderModule=NativeModules.AudioRecorderModule作为AudioRecorderInterface&EventSubscriptionVendor
new NativeEventMitter()
只接受带有
NativeModule
类型的参数。我发现您这样做很有趣
AudioRecorderModule.addAudioRecorderEventListener=(data=>void)=>eventEmitter.addListener()
我今晚或明天早上会试试。这是TypeScript调用方法的推荐方式,还是我觉得这是一种很有攻击性的
方法?无论如何,谢谢你!明天早上我会将此标记为解决方案,它看起来确实是解决方案。老实说,我没有太多使用
NativeModules
的经验。一般来说,我擅长识别TS错误,因此我可以看到需要的类型,但我不知道
AudioRecorderModule
实际上是什么。react native中的
NativeModules
对象的类型非常松散,因此当您访问属性时,属性具有type
any
:我使用
as
来断言正确的类型,但也许您可以扩展react native
NativeModulesStatic
类型。我正在添加
addAudioRecorderEventListener
作为
AudioRecorderModule
对象的一个属性,这……可能还可以吗?但我也不知道录音模块实际上是什么样子。我只是断言它需要什么样的外观才能让你的代码工作。我想我在
d.ts
应该如何工作上犯了错误。我还尝试了您的解决方案
const AudioRecorderModule=NativeModules.AudioRecorderModule作为AudioRecorderInterface&EventSubscriptionVendor
new NativeEventMitter()
只接受带有
NativeModule
类型的参数。我发现您这样做很有趣
AudioRecorderModule.addAudioRecorderEventListener=(data=>void)=>eventEmitter.addListener()
我今晚或明天早上会试试。这是TypeScript调用方法的推荐方式,还是我觉得这是一种很有攻击性的
方法?无论如何,谢谢你!明天早上我会将此标记为解决方案,它看起来确实是解决方案。老实说,我没有太多使用
NativeModules
的经验。一般来说,我擅长识别TS错误,因此我可以看到需要的类型,但我不知道
AudioRecorderModule
实际上是什么。react native中的
NativeModules
对象的类型非常松散,因此当您访问属性时,属性具有type
any
:我使用
as
来断言正确的类型,但是也许您可以扩展react native
NativeModulesStatic
类型。我正在添加
addAudioRecorderEventListener
作为
AudioRecorderModule
对象的属性