打字稿初始化带有只读属性的对象

时间:2019-06-11 10:05:22

标签: typescript

是否可以初始化对象文字并同时使用只读属性声明其接口?

例如

let a = { readonly b: 2, readonly c: 3 }

2 个答案:

答案 0 :(得分:1)

您可以使用package com.rot.rot; import android.Manifest; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import org.altbeacon.beacon.Beacon; import org.altbeacon.beacon.BeaconConsumer; import org.altbeacon.beacon.BeaconManager; import org.altbeacon.beacon.BeaconParser; import org.altbeacon.beacon.Identifier; import org.altbeacon.beacon.RangeNotifier; import org.altbeacon.beacon.Region; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * App main activity, gestiona la detección de beacons, mostrando un mensaje de los beacons * detectados * * @author David González Verdugo */ public class BLE_Service extends AppCompatActivity implements View.OnClickListener, BeaconConsumer, RangeNotifier { protected final String TAG = BLE_Service.this.getClass().getSimpleName();; private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1; private static final int REQUEST_ENABLE_BLUETOOTH = 1; //private static final long DEFAULT_SCAN_PERIOD_MS = 6000l; private static final String ALL_BEACONS_REGION = "AllBeaconsRegion"; //COn los dos variable ssiguientes conseguimos que este escaneando el 100% del tiempo private static final int SCAN_MODE_LOW_LATENCY_WINDOW_MS = 4096; private static final int SCAN_MODE_LOW_LATENCY_INTERVAL_MS = 4096; // Para interactuar con los beacons desde una actividad private BeaconManager mBeaconManager; // Representa el criterio de campos con los que buscar beacons private Region mRegion; private Button btn_start, btn_stop; private TextView textView; private BroadcastReceiver broadcastReceiver; private BroadcastReceiver broadcastReceiverBLE; int contadordedatosenviados=0; RequestQueue queue; JsonObjectRequest request; Map<String, String> map = new HashMap<String, String>(); String Usuario; // Variable usuario para utilizar durante el fichero String Nom_Carrera; String latitud; String longitud; ArrayList<String> memoriacorredores = new ArrayList<String>(); @Override protected void onResume() { super.onResume(); if(broadcastReceiver == null){ broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //textView.append("\n" +intent.getExtras().get("coordinates")); String sIntent = ""+intent.getExtras().get("coordinates"); String lat=sIntent.split(" ")[1]; String lon=sIntent.split(" ")[0]; TextView latit = (TextView)findViewById(R.id.Latitud); latit.setText("Latitud: "+lat); TextView longt = (TextView)findViewById(R.id.Longitud); longt.setText("Longitud: "+lon); latitud=lat; longitud=lon; } }; } if(broadcastReceiverBLE == null){ broadcastReceiverBLE = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { alertmessageLogin(55); } }; } registerReceiver(broadcastReceiver,new IntentFilter("location_update")); registerReceiver(broadcastReceiverBLE,new IntentFilter("BLE_update")); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ble_service); getStartButton().setOnClickListener(this); getStopButton().setOnClickListener(this); mBeaconManager = BeaconManager.getInstanceForApplication(this); // Fijar un protocolo beacon, Eddystone en este caso mBeaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); // Y aqui el parser para otro tipo de beacons como ibeacons mBeaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24")); mBeaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); // Detect the Eddystone telemetry (TLM) frame: mBeaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15")); // Detect the Eddystone URL frame: mBeaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-20v")); ArrayList<Identifier> identifiers = new ArrayList<>(); mRegion = new Region(ALL_BEACONS_REGION, identifiers); getSupportActionBar().hide();//<!-- Para que no salga la barra superior en todas las activitis--> Bundle p = getIntent().getExtras(); String usu = p.getString("EXTRA_SESSION_USER"); String car = p.getString("EXTRA_SESSION_USER2"); Usuario = usu; Nom_Carrera = car; memoriacorredores.add("inicializacion"); btn_start = (Button) findViewById(R.id.button); btn_stop = (Button) findViewById(R.id.button2); //textView = (TextView) findViewById(R.id.textView); if (!runtime_permissions()) enable_buttons(); } @Override public void onClick(View view) { if (view.equals(findViewById(R.id.startReadingBeaconsButton))) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Si los permisos de localización todavía no se han concedido, solicitarlos if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { askForLocationPermissions(); } else { // Permisos de localización concedidos prepareDetection(); } } else { // Versiones de Android < 6 prepareDetection(); } } else if (view.equals(findViewById(R.id.stopReadingBeaconsButton))) { stopDetectingBeacons(); BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // Desactivar bluetooth if (mBluetoothAdapter.isEnabled()) { mBluetoothAdapter.disable(); } } } /** * Activar localización y bluetooth para empezar a detectar beacons */ private void prepareDetection() { if (!isLocationEnabled()) { askToTurnOnLocation(); } else { // Localización activada, comprobemos el bluetooth BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { showToastMessage(getString(R.string.not_support_bluetooth_msg)); } else if (mBluetoothAdapter.isEnabled()) { startDetectingBeacons(); } else { // Pedir al usuario que active el bluetooth Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BLUETOOTH); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_ENABLE_BLUETOOTH) { // Usuario ha activado el bluetooth if (resultCode == RESULT_OK) { startDetectingBeacons(); } else if (resultCode == RESULT_CANCELED) { // User refuses to enable bluetooth showToastMessage(getString(R.string.no_bluetooth_msg)); } } super.onActivityResult(requestCode, resultCode, data); } /** * Empezar a detectar los beacons, ocultando o mostrando los botones correspondientes */ private void startDetectingBeacons() { // Fijar un periodo de escaneo //mBeaconManager.setForegroundScanPeriod(DEFAULT_SCAN_PERIOD_MS); mBeaconManager.setForegroundScanPeriod(SCAN_MODE_LOW_LATENCY_WINDOW_MS); mBeaconManager.setForegroundBetweenScanPeriod(SCAN_MODE_LOW_LATENCY_INTERVAL_MS); // Enlazar al servicio de beacons. Obtiene un callback cuando esté listo para ser usado mBeaconManager.bind(this); // Desactivar botón de comenzar getStartButton().setEnabled(false); getStartButton().setAlpha(.5f); // Activar botón de parar getStopButton().setEnabled(true); getStopButton().setAlpha(1); } @Override public void onBeaconServiceConnect() { try { // Empezar a buscar los beacons que encajen con el el objeto Región pasado, incluyendo // actualizaciones en la distancia estimada mBeaconManager.startRangingBeaconsInRegion(mRegion); showToastMessage(getString(R.string.start_looking_for_beacons)); } catch (RemoteException e) { Log.d(TAG, "Se ha producido una excepción al empezar a buscar beacons " + e.getMessage()); } mBeaconManager.addRangeNotifier(this); } /** * Método llamado cada DEFAULT_SCAN_PERIOD_MS segundos con los beacons detectados durante ese * periodo */ @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { if (beacons.size() == 0) { showToastMessage(getString(R.string.no_beacons_detected)); } for (Beacon beacon : beacons) { if (beacon.getServiceUuid() == 0xfeaa) {// Aquí entraria en caso de Edystone // This is Eddystone, which uses a service Uuid of 0xfeaa Identifier eddystoneNamespaceId = beacon.getId1(); Identifier eddystoneInstanceId = beacon.getId2(); //Identifier eddystoneInstanceId3 = beacon.getId3(); NO tine id 3 eddystone showToastMessage(getString(R.string.beacon_detected, beacon.getId2())); } else{// NE el caso de otro parse como por ejemplo ibeacon showToastMessage(getString(R.string.beacon_detected, beacon.getBluetoothName())); } try { enviardato(String.valueOf(beacon.getId3())); } catch (IOException e) { e.printStackTrace(); } } } private void stopDetectingBeacons() { try { mBeaconManager.stopMonitoringBeaconsInRegion(mRegion); showToastMessage(getString(R.string.stop_looking_for_beacons)); } catch (RemoteException e) { Log.d(TAG, "Se ha producido una excepción al parar de buscar beacons " + e.getMessage()); } mBeaconManager.removeAllRangeNotifiers(); // Desenlazar servicio de beacons mBeaconManager.unbind(this); // Activar botón de comenzar getStartButton().setEnabled(true); getStartButton().setAlpha(1); // Desactivar botón de parar getStopButton().setEnabled(false); getStopButton().setAlpha(.5f); } /** * Comprobar permisión de localización para Android >= M */ private void askForLocationPermissions() { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.location_access_needed); builder.setMessage(R.string.grant_location_access); builder.setPositiveButton(android.R.string.ok, null); builder.setOnDismissListener(new DialogInterface.OnDismissListener() { @RequiresApi(api = Build.VERSION_CODES.M) public void onDismiss(DialogInterface dialog) { requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); } }); builder.show(); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case PERMISSION_REQUEST_COARSE_LOCATION: { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { prepareDetection(); } else { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.funcionality_limited); builder.setMessage(getString(R.string.location_not_granted) + getString(R.string.cannot_discover_beacons)); builder.setPositiveButton(android.R.string.ok, null); builder.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { } }); builder.show(); } return; } } } public void onRequestPermissionsResult2(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 100){ if( grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){ enable_buttons(); }else { runtime_permissions(); } } } /** * Comprobar si la localización está activada * * @return true si la localización esta activada, false en caso contrario */ private boolean isLocationEnabled() { LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); boolean networkLocationEnabled = false; boolean gpsLocationEnabled = false; try { networkLocationEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); gpsLocationEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); } catch (Exception ex) { Log.d(TAG, "Excepción al obtener información de localización"); } return networkLocationEnabled || gpsLocationEnabled; } /** * Abrir ajustes de localización para que el usuario pueda activar los servicios de localización */ private void askToTurnOnLocation() { // Notificar al usuario AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setMessage(R.string.location_disabled); dialog.setPositiveButton(R.string.location_settings, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface paramDialogInterface, int paramInt) { // TODO Auto-generated method stub Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(myIntent); } }); dialog.show(); } private Button getStartButton() { return (Button) findViewById(R.id.startReadingBeaconsButton); } private Button getStopButton() { return (Button) findViewById(R.id.stopReadingBeaconsButton); } /** * Mostrar mensaje * * @param message mensaje a enseñar */ private void showToastMessage (String message) { Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } public void enviardato(String identificador) throws IOException { //Actualizamos numeor de datos enviados //contadordedatosenviados=contadordedatosenviados+1; String IDcorredor=identificador; //Comprovamos que no ha enviado un dato con ese mismo id, ya que un mismo voluntario solo debe cojer le dato de un mismo corroedor. Es una forma de tener una memeoria if(identificador.equals("6105")){ int c; int res=0; int resneg=0; for(c=0;c<memoriacorredores.size();c++){ if(memoriacorredores.get(c).equals(IDcorredor)){ res++; } else{ resneg++; } } if (res!=0){ alertmessageLogin(8); return; } //Actualizamos numeor de datos enviados contadordedatosenviados=contadordedatosenviados+1; memoriacorredores.add(IDcorredor); IDcorredor="1";//conversion al actual id } if(identificador.equals("27720")){ int c; int res=0; int resneg=0; for(c=0;c<memoriacorredores.size();c++){ if(memoriacorredores.get(c).equals(IDcorredor)){ res++; } else{ resneg++; } } if (res!=0){ alertmessageLogin(8); return; } //Actualizamos numeor de datos enviados contadordedatosenviados=contadordedatosenviados+1; memoriacorredores.add(IDcorredor); IDcorredor="2";//conversion al actual id } TextView Numero = (TextView)findViewById(R.id.numerodeenvios); Numero.setText(String.valueOf(contadordedatosenviados));//Como el textview solo muestra string hay que pasar el integer a string // Creamos la cola de Peticiones/Solicitudes queue = Volley.newRequestQueue(this); // Los parametros para el php, hacemos el mapping para poder pasarlo a JSON // map.put(KEY, VALUE); map.put("unameV", Usuario); map.put("latitud", latitud); map.put("longitud", longitud); map.put("nomcarrera", Nom_Carrera); map.put("IDCorredor", IDcorredor); //Lo recibimos por BLE String url="http://"+getResources().getString(R.string.ip_server_Login)+"/InsertarDato_APP.php"; // Cremos la variable url para que se edite automaticamente desde el fichero Strings // La solicitud JSON // JsonObjectRequest(METHOD, URL, JSONOBJECT(PARAMETERS), OK_LISTENER, ERROR_LISTENER); request = new JsonObjectRequest( Request.Method.POST, // the request method //getResources().getString(R.string.meatShootingMessage, numPoundsMeat); //"http://192.168.43.84:8080/check-login_APP_voluntarios.php", // the URL url, new JSONObject(map), // the parameters for the php new Response.Listener<JSONObject>() { // the response listener @Override public void onResponse(JSONObject response){ // Aquí parseamos la respuesta Log.d("Response", String.valueOf(response)); // Aquí parseamos la respuesta JSONObject myJson = response; String resp = null; try { //Comprovamos la respuesta recivida del server resp = myJson.getString("res"); if(resp.equals("OK")) {//Se ha inciado sesion corectamente //alertmessageLogin(1); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { // the error listener @Override public void onErrorResponse(VolleyError error) { // En caso de error con la conexon con el server entrariamos en esta parte del codigo alertmessageLogin(4); } }); // Ejecutamos la solicitud para btener la informcion en formato JSON queue.add(request); } @Override protected void onDestroy() { super.onDestroy(); mBeaconManager.removeAllRangeNotifiers(); mBeaconManager.unbind(this); if(broadcastReceiver != null){ unregisterReceiver(broadcastReceiver); } } private void enable_buttons() { btn_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i =new Intent(getApplicationContext(),GPS_Service.class); startService(i); Intent ble =new Intent(getApplicationContext(),BLE_Service.class); startService(ble); } }); btn_stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(getApplicationContext(),GPS_Service.class); stopService(i); Intent ble = new Intent(getApplicationContext(),BLE_Service.class); stopService(ble); } }); } private boolean runtime_permissions() { if(Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},100); return true; } return false; } public void alertmessageLogin(int a){ // Función donde creamos todos los alert necesarios // make a handler that throws a runtime exception when a message is received final Handler handler = new Handler() { public void handleMessage(Message mesg) { throw new RuntimeException(); } }; // make a text input dialog and show it AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Datos:"); // El titulo de todos los alert es el nombre de la ativity //Dependiendo del valor de a saltara un activity diferente if (a==1){ builder.setMessage("Dato insertado correctamente"); } if (a==4){ builder.setMessage("ESTA APLICACION REQUIERE CONEXION CON EL SERVIDOR PARA FUNCIONAR. ASEGURESE DE TENERLA."); } if (a==8){ builder.setMessage("Este identificador ya ha registrado un dato."); } builder.setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { handler.sendMessage(handler.obtainMessage()); } }); builder.show(); // Mostramos el alert // loop till a runtime exception is triggered. try { Looper.loop(); } catch(RuntimeException e2) {} } } 断言:

as const

如果只希望某些道具是只读的,那是不可能的,最好的办法是使用let a = { b: 2, c: 3 } as const // typed as { readonly b: 2; readonly c: 3; } a.b = 2 //Cannot assign to 'b' because it is a read-only property. ,其中一部分包含只读属性,另一部分包含可变属性:

Object.assign

答案 1 :(得分:-2)

您可以使用自定义类型编写

type Point = {
  readonly x: number;
  readonly y: number;
};
const a: Point = {
  x: 1,
  y: 2,
};

a.x = 2; // ERROR Cannot assign to 'x' because it is a constant or a read-only property.