Oli*_*alo 188 typescript
我正在查看TypeScript代码,并注意到他们使用:
interface Blablabla {
field: Object;
}
Run Code Online (Sandbox Code Playgroud)
使用Objectvs有什么好处any,如:
interface Blablabla {
field: any;
}
Run Code Online (Sandbox Code Playgroud)
die*_*lar 252
有点旧,但添加一些笔记并没有伤害.
当你写这样的东西
var a: any;
var b: Object;
var c: {};
Run Code Online (Sandbox Code Playgroud)
这就是原因
a.doSomething(); // Ok: the compiler trusts you on that
b.doSomething(); // Error: Object has no doSomething member
c.doSomething(); // Error: c neither has doSomething nor inherits it from Object
Run Code Online (Sandbox Code Playgroud)
为什么
a.toString(); // Ok: whatever, dude, have it your way
b.toString(); // Ok: toString is defined in Object
c.toString(); // Ok: c inherits toString from Object
Run Code Online (Sandbox Code Playgroud)
因此,无论Object和{}是等价的打字稿.我没有看到任何人真正使用它.限制太多了.
如果你声明这样的函数
function fa(param: any): void {}
function fb(param: Object): void {}
Run Code Online (Sandbox Code Playgroud)
为了接受param的任何东西(也许你将在运行时检查类型以决定如何处理它),请记住
所以,基本上,当你不知道类型时,请使用any并进行运行时类型检查.
显然,OO继承规则仍然适用,所以如果你想接受派生类的实例并根据它们的基类型对它们进行处理,就像在
interface IPerson {
gender: string;
}
class Person implements IPerson {
gender: string;
}
class Teacher extends Person {}
function func(person: IPerson): void {
console.log(person.gender);
}
func(new Person()); // Ok
func(new Teacher()); // Ok
func({gender: 'male'}); // Ok
func({name: 'male'}); // Error: no gender..
Run Code Online (Sandbox Code Playgroud)
基本类型是这样做的方式,而不是任何方式.但那是OO,超出范围,我只是想澄清一下,任何应该只在你不知道什么时候才会被使用,而对于任何其他你应该注释正确的类型.
更新:
打字稿2.2加入object类型,指定一个值是一个非原语:(即,不是一个number,string,boolean,symbol,undefined,或null).
考虑定义为的函数:
function b(x: Object) {}
function c(x: {}) {}
function d(x: object) {}
Run Code Online (Sandbox Code Playgroud)
x将在所有这些函数中具有相同的可用属性,但是d使用非原始函数调用它是一个类型错误:
b("foo"); //Okay
c("foo"); //Okay
d("foo"); //Error: "foo" is a primitive
Run Code Online (Sandbox Code Playgroud)
Nyp*_*pan 185
Object比...更具限制性any.那是:
let a: any;
let b: Object;
a.nomethod(); // Transpiles just fine
b.nomethod(); // Error: Property 'nomethod' does not exist on type 'Object'.
Run Code Online (Sandbox Code Playgroud)
将不编译,因为Object不具备nomethod()的功能.如果你any在界面中使用而不是a它将编译.
所以简而言之,any可以是任何东西(你可以在没有编译错误的情况下调用任何方法等).如果明确使用any,则只能使用在Object类上定义的属性.
bas*_*rat 23
any 亚力克斯的回答很好地解释了TypeScript特有的东西.
Object指的是JavaScript object类型.常用{}或有时候使用new Object.javascript中的大多数内容与对象数据类型兼容,因为它们从中继承.但TypeScriptany是特定的,并且与两个方向上的所有内容兼容(不基于继承).例如:
var foo:Object;
var bar:any;
var num:number;
foo = num; // Not an error
num = foo; // ERROR
// Any is compatible both ways
bar = num;
num = bar;
Run Code Online (Sandbox Code Playgroud)
yel*_*ode 17
与所有类型派生自"对象"的.NET相反,在TypeScript中,所有类型都派生自"any".我只是想添加这个比较,因为我认为这将是一个常见的比较,因为更多的.NET开发人员尝试使用TypeScript.
Ale*_*sko 14
对象似乎是一个比任何更具体的声明.从TypeScript规范(第3节):
TypeScript中的所有类型都是名为Any类型的单个顶级类型的子类型.any关键字引用此类型.Any类型是可以表示没有约束的任何JavaScript值的一种类型.所有其他类型分类为基本类型,对象类型或类型参数.这些类型在其值上引入了各种静态约束.
也:
Any类型用于表示任何JavaScript值.Any类型的值支持与JavaScript中的值相同的操作,并且对Any值的操作执行最小的静态类型检查.具体来说,任何名称的属性都可以通过Any值访问,Any值可以作为带有任何参数列表的函数或构造函数调用.
对象不允许相同的灵活性.
例如:
var myAny : any;
myAny.Something(); // no problemo
var myObject : Object;
myObject.Something(); // Error: The property 'Something' does not exist on value of type 'Object'.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
146497 次 |
| 最近记录: |