0le*_*leg 18 typescript ecmascript-6
试图找出TypeScript中这两种类型之间的区别:
foo: object
和
bar: {}?
示例:尝试将一个object变量分配给假设处理请求的标头信息的变量:
headers: object;
Run Code Online (Sandbox Code Playgroud)
导致错误:
类型'object'不能赋值给'{[key:string]:string}`.
如果使用相同的条件headers: {},则会导致结论{}略微不那么严格.
ora*_*rad 42
以下示例显示了不同类型的对象的行为有何不同:
var o: object;
o = { prop: 0 }; // OK
o = []; // OK
o = 42; // Error
o = "string"; // Error
o = false; // Error
o = null; // Error
o = undefined; // Error
var p: {}; // or Object
p = { prop: 0 }; // OK
p = []; // OK
p = 42; // OK
p = "string"; // OK
p = false; // OK
p = null; // Error
p = undefined; // Error
var q: { [key: string]: any };
q = { prop: 0 }; // OK
q = []; // OK
q = 42; // Error
q = "string"; // Error
q = false; // Error
q = null; // Error
q = undefined; // Error
var r: { [key: string]: string };
r = { prop: 'string' }; // OK
r = { prop: 0 }; // Error
r = []; // Error
r = 42; // Error
r = "string"; // Error
r = false; // Error
r = null; // Error
r = undefined; // Error
Run Code Online (Sandbox Code Playgroud)
有了这个,我们可以说:
{}这与 typeObject是最不具体的相同。您可以为其分配对象、数组和原语。object更具体,类似于{ [key: string]: any }. 您可以为其分配对象和数组,但不能为其分配基元。{ [key: string]: string } 是最具体的,它不允许将具有非字符串值的任何原始类型、数组或对象分配给它。Alb*_*rtK 20
打字稿有三种类型的困惑:Object,{}和object。
如果禁用了编译器选项,则可以将null和分配undefined给所有这三种类型,strictNullChecks否则会发生编译错误。
包含所有JavaScript对象中存在的内容(例如toString(),hasOwnProperty())。可以将任何值(原始,非原始)分配给Objecttype。
{}是一个空对象。与相同Object。
object 是TypeScript 2.2中引入的。它是任何非基本类型。你不能给它分配任何原始类型一样bool,number,string,symbol。
因此,如果您尝试这样做:
var strictTypeHeaders: { [key: string]: string } = {}; // non-primitive type
var header: object = {};
header = strictTypeHeaders; // its OK
strictTypeHeaders = header; // causes error "Type 'object' is not assignable to type '{ [key: string]: string }`"
Run Code Online (Sandbox Code Playgroud)
您将在最后一行收到编译错误。发生这种情况是因为{ [key: string]: string }类型比object类型更具体。没有任何错误的header = strictTypeHeaders,因为这两种类型都是非原始的和object更常见的类型比{ [key: string]: string }
| 归档时间: |
|
| 查看次数: |
1777 次 |
| 最近记录: |