javascript - definitely - Anulando el tipo de propiedad de la interfaz definido en el archivo Typscript d.ts
definitelytyped search (3)
¿Hay alguna manera de cambiar el tipo de propiedad de la interfaz definida en un *.d.ts
en mecanografiado?
por ejemplo: una interfaz en xdts
se define como
interface A {
property: number;
}
Quiero cambiarlo en los archivos mecanografiados en los que escribo
interface A {
property: Object;
}
o incluso esto funcionaria
interface B extends A {
property: Object;
}
¿Funcionará este enfoque? No funcionó cuando lo probé en mi sistema. Sólo quiero confirmar si es posible?
Gracias
Es gracioso pasar el día investigando la posibilidad de resolver el mismo caso. Encontré que no es posible hacerlo de esta manera:
// a.ts - module
export interface A {
x: string | any;
}
// b.ts - module
import {A} from ''./a'';
type SomeOtherType = {
coolStuff: number
}
interface B extends A {
x: SomeOtherType;
}
Causa Es posible que un módulo no conozca todos los tipos disponibles en su aplicación. Y es bastante aburrido portar todo desde cualquier lugar y hacer un código como este.
export interface A {
x: A | B | C | D ... Million Types Later
}
Tienes que definir el tipo más adelante para que el autocompletar funcione bien.
Así que puedes engañar un poco:
// a.ts - module
export interface A {
x: string;
}
Dejó el tipo predeterminado por defecto, que permite trabajos de autocompletar, cuando no se requieren reemplazos.
Entonces
// b.ts - module
import {A} from ''./a'';
type SomeOtherType = {
coolStuff: number
}
// @ts-ignore
interface B extends A {
x: SomeOtherType;
}
Deshabilite la excepción estúpida aquí usando @ts-ignore
flag, diciéndonos que estamos haciendo algo mal. Y lo gracioso todo funciona como se espera.
En mi caso, estoy reduciendo el alcance de la visión de tipo x
, me permite hacer un código más estricto. Por ejemplo, tiene una lista de 100 propiedades y la reduce a 10 para evitar situaciones estúpidas.
No puede cambiar el tipo de una propiedad existente.
Puedes añadir una propiedad:
interface A {
newProperty: any;
}
Pero cambiando un tipo de uno existente:
interface A {
property: any;
}
Resultados en un error:
Las declaraciones de variables posteriores deben tener el mismo tipo. La variable ''propiedad'' debe ser del tipo ''número'', pero aquí tiene el tipo ''cualquier''
Por supuesto, puede tener su propia interfaz que amplía una existente. En ese caso, puede anular un tipo solo a un tipo compatible, por ejemplo:
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Por cierto, probablemente deberías evitar usar Object
como un tipo, en lugar de usar el tipo any
.
En los documentos para any
tipo dice:
Cualquier tipo es una forma poderosa de trabajar con JavaScript existente, lo que le permite optar gradualmente por la verificación de tipos durante la compilación. Podría esperar que el Objeto desempeñe un papel similar, como lo hace en otros idiomas. Pero las variables de tipo Objeto solo le permiten asignarles un valor, no se pueden llamar métodos arbitrarios, incluso los que realmente existen :
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn''t check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property ''toFixed'' doesn''t exist on type ''Object''.
Utilizo un método que primero filtra los campos y luego los combina.
Referencia Excluir propiedad del tipo.
interface A {
x: string
}
export type B = Omit<A, ''x''> & { x: number };
para la interfaz:
interface A {
x: string
}
interface B extends Omit<A, ''x''> {
x: number
}