天道酬勤,学无止境

打字稿错误:“对象”类型的参数不可分配给“{}[]”类型的参数(Typescript error: Argument of type 'Object' is not assignable to parameter of type '{}[]')

问题

我正在使用 Angular Material 表组件,如下所示:

    this.userService.getUsers().subscribe((response) => {
        this.users = new MatTableDataSource(response);
    });

它可以工作,但在编译时会引发以下打字稿错误:

“Object”类型的参数不可分配给“{}[]”类型的参数。 “对象”类型可分配给很少的其他类型。 您的意思是改用“任何”类型吗? “对象”类型中缺少属性“包含”。

所以我尝试将其更改为:

this.users = new MatTableDataSource<any>(response);

但还是同样的错误。 response如下所示:

[{
    userId: 123,
    username: 'Tom'
}, {
    userId: 456,
    username: 'Joe'
}]

知道如何摆脱错误吗?

编辑

应该提到如果我这样做:

this.users = new MatTableDataSource([response]);

错误消失了,但是表格不起作用,因为格式不是表格所期望的正确格式。 只是注意到这一点,以防万一它揭示了可能是什么原因......

回答1

“Object”类型的参数不可分配给“{}[]”类型的参数。

这并不意味着MatTableDataSource接受了错误的参数,而是您的response类型错误。 您应该明确地将类型转换为:

  (response: {userId: number, username: string }[]) =>

或者在传递时这样做:

 new MatTableDataSource(response as {userId: number, username: string }[])
回答2

您的subscribe()函数需要传递any

在您的情况下(如评论中所述):

this.users = new MatTableDataSource(<any> response);

在某些情况下,它可能是这样的:

const myLocalData = this.getData(<any> response);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 打字稿类型“字符串”不可分配给类型(Typescript Type 'string' is not assignable to type)
    问题 这是我在fruit.ts中拥有的东西 export type Fruit = "Orange" | "Apple" | "Banana" 现在,我要在另一个打字稿文件中导入fruit.ts。 这就是我所拥有的 myString:string = "Banana"; myFruit:Fruit = myString; 当我做 myFruit = myString; 我收到一个错误: 类型'string'不能分配给类型'“ Orange” | “苹果” | “香蕉”' 如何为自定义类型Fruit的变量分配字符串? 回答1 您需要强制转换: export type Fruit = "Orange" | "Apple" | "Banana"; let myString: string = "Banana"; let myFruit: Fruit = myString as Fruit; 另请注意,在使用字符串文字时,您只需要使用| 编辑 如@Simon_Weaver的另一个答案中所述,现在可以将其声明为const : let fruit = "Banana" as const; 回答2 打字稿3.4引入了新的'const'断言 现在,您可以防止文字类型(例如'orange'或'red' )被“加宽”以使用所谓的const断言键入string 。 您将可以执行以下操作: let
  • 打字稿通用类型不可分配错误(Typescript Generic type not assignable error)
    问题 试图创建一个泛型,但它显示错误:类型“用户 []”不可分配给类型 T[] 无法理解这样做有什么问题- interface User { name: string, age: number } interface Movie { title: string, language: string } function getItems<T>(arg: number|string): T[] { let useList: User[] = []; let movieList: Movie[] = []; if (typeof arg == 'string') { return useList; } else { return movieList; } } var a: User[] = getItems<User>('user_list'); 回答1 您应该为您的案例使用函数重载而不是泛​​型。 请注意,带有实现的函数的签名将被编译器隐藏。 function getItems(arg: string): User[]; function getItems(arg: number): Movie[]; function getItems(arg: number | string) { let useList: User[] = []; let movieList: Movie[] =
  • 如何通过打字稿在 Formik 中添加强类型字段?(How to add strongly typed field in Formik by typescript?)
    问题 我试图通过打字稿在 Formik 反应库中添加强类型,但我没有这样做。 当然,我已经使用了这个链接,但我无法解决我的问题。 https://jaredpalmer.com/formik/docs/guides/typescript 我从这部分代码(})(ActivityForm);)中得到了这个错误: '(props: IProps) => Element' 类型的参数不可分配给'CompositeComponent & FormikState & FormikHelpers & FormikHandlers & FormikComputedProps & FormikRegistration & { ...; }>'。 类型 '(props: IProps) => Element' 不可分配给类型 'FunctionComponent & FormikState & FormikHelpers & FormikHandlers & FormikComputedProps & FormikRegistration & { ...; }>'。 参数 'props' 和 'props' 的类型不兼容。 “FormikSharedConfig<{}> & FormikState & FormikHelpers & FormikHandlers &
  • 类型“{}”不可分配给类型“IntrinsicAttributes & IntrinsicClassAttributes”(Type '{}' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes)
    问题 我目前正在制作一个简单的反应应用程序。 这是我的index.tsx import * as React from 'react'; import * as ReactDOM from 'react-dom'; import App from './components/App'; import registerServiceWorker from './registerServiceWorker'; ReactDOM.render( <App />, document.getElementById('root') as HTMLElement ); registerServiceWorker(); 在这里我有我的app.tsx import * as React from 'react'; import SearchBar from '../containers/price_search_bar'; interface Props { term: string; } class App extends React.Component<Props> { // tslint:disable-next-line:typedef constructor(props) { super(props); this.state = {term: '' }; } render() {
  • 在 Angular 8 应用程序中获取选项配置的打字稿错误(Getting typescript error for options configuration in an Angular 8 app)
    问题 尝试使用rest api和get调用调用服务时出现以下错误: '{ headers: HttpHeaders; 类型的参数响应类型:字符串; }' 不能分配给类型为 '{ headers?: HttpHeaders | 的参数 { [标题:字符串]:字符串 | 细绳[]; }; 观察?:“身体”; 参数?:HttpParams | { [参数:字符串]:字符串 | 细绳[]; }; 报告进度?:布尔值; 响应类型?:“json”; withCredentials?: 布尔值; }'。 属性“responseType”的类型不兼容。 类型 'string' 不可分配给类型 '"json"'.ts(2345) const httpOptionsText = { headers: new HttpHeaders({ 'Accept': 'text/plain', 'Content-Type': 'text/plain' }), responseType: 'text' }; 这是使用 httpOptionsPlain 作为参数的服务调用,它是错误的签名。 @Injectable() export class TripService { public getTripNameById(tripId: number): Observable<any> { return this.http
  • 打字稿索引属性约束检查在原始类型上工作而不是在对象文字上工作?(Typescript indexed properties constraint checks working on raw types but not on object literals?)
    问题 有这个接口声明: interface Thing1 { [key: string]: string; x: number; } 打字稿在编译时抛出错误“TS2411:类型编号的属性‘x’不可分配给字符串索引类型‘字符串’” 这听起来合法。 但是,一旦我使用对象文字作为我的索引类型值: interface Foo {} interface Thing2 { [key: string]: Foo; foo: number; } ...它不再抱怨了,这对我来说听起来很奇怪,因为number仍然是与Foo不同的类型 关于这背后的原因的任何想法? 注意:使用 Typescript 2.1.5 回答1 这是由于 TypeScript 中类型兼容性的工作方式: TypeScript 中的类型兼容性基于结构子类型。 结构类型是一种仅基于其成员关联类型的方法。 这与名义打字相反。 所以,这有效: interface Foo {} let f: Foo = 3; 因为对于{}上的每个属性,在Number上都有一个具有相同名称和类型的属性。 这意味着这不起作用: interface Foo {} let f: Foo = 3; let b: number = f; 编译器抱怨let b: number = f; : 类型 'Foo' 不能分配给类型 'number'; 再次,从文档中:
  • Angular 2 引导函数给出错误“参数类型 AppComponent 不可分配给参数类型类型”(Angular 2 bootstrap function gives error “Argument type AppComponent is not assignable to parameter type Type”)
    问题 这是我来自 Angular 2 快速入门指南的第一个简单的Hello World angular 2 应用程序。 import {Component} from 'angular2/core'; import {bootstrap} from 'angular2/platform/browser'; @Component({ selector: 'ng2-app', template: '<h1>My first Angular 2 App</h1>' }) export class AppComponent { } bootstrap(AppComponent); 当我使用npm start运行时,应用程序运行良好,但我的 IntelliJ IDE 在bootstrap(AppComponent)行中显示错误 参数类型AppComponent不可分配给参数类型Type 查看bootstrap函数声明, AppComponent需要扩展Type 。 export declare function bootstrap(appComponentType: Type, customProviders?: Array<any>): Promise<ComponentRef>; 我的问题是: Angular 组件是否可以扩展Type ? 回答1 实际上, AppComponent
  • 打字稿数组与任何[](Typescript Array vs any[])
    问题 在TypeScript中, Array和any[]什么区别? Array是否引用了动态大小的数组(当然是在编译时), any[]引用了作为参数传递并由编译器进行类型推断的静态大小的数组吗? 因为当前当我具有以下功能时: mergeArrays(arr1 : Array, arr2 : Array); 当您使用静态数据调用此函数时,TypeScript使用类型化的数组( type[] )。 mergeArrays([true, false], [1, 2]); // bool[] number[] 那么两者之间在编译时间上有什么区别吗? 什么时候使用any[]和什么时候使用Array ? 有时用Array ..定义变量 var info:Array; 如下设置时,.. show错误如“无法将任何[] []转换为数组”: info = [[], []]; 回答1 规范第3.5.4节指定了它们之间的关系: 形式为ElementType[]的数组类型等效于具有索引签名[index: number]: ElementType的对象类型[index: number]: ElementType加上与全局接口类型Array等效的一组成员,在该Array ,所有出现的_element类型魔术都替换为ElementType 。 无法将[[], []]或[]分配给Array是一个错误。
  • 打字稿编译器错误? Knockout.validation.d.ts 不再编译(typescript compiler bug? knockout.validation.d.ts doesn't compile anymore)
    问题 我刚刚将 Typescript 从 v2.3 更新到 v2.4,现在它在 Knockout.validation.d.ts 行上给了我一个错误: interface KnockoutSubscribableFunctions<T> { isValid: KnockoutComputed<boolean>; isValidating: KnockoutObservable<boolean>; rules: KnockoutObservableArray<KnockoutValidationRule>; isModified: KnockoutObservable<boolean>; error: KnockoutComputed<string>; setError(error: string): void; clearError(): void; } 在这里,knockout.validation 试图表明 KnockoutSubscribableFunctions 现在有额外的成员。 这是knockout.d.ts中这个接口的定义: interface KnockoutSubscribableFunctions<T> { [key: string]: KnockoutBindingHandler; notifySubscribers(valueToWrite?: T
  • 打字稿:字符串和字符串之间的区别(Typescript: difference between String and string)
    问题 有人知道TypeScript中String和string之间的区别吗? 我以为它们应该相同是正确的吗? var a: String = "test"; var b: string = "another test"; a = b; b = a; // this gives a compiler error! 当前版本的编译器显示: Type 'String' is not assignable to type 'string'. 'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible. 那是个错误吗? 回答1 这是一个显示差异的示例,这将有助于进行解释。 var s1 = new String("Avoid newing things where possible"); var s2 = "A string, in TypeScript of type 'string'"; var s3: string; String是JavaScript字符串类型,可用于创建新字符串。 没有人会这样做,因为在JavaScript中认为字面值更好,因此上面示例中的s2创建了一个新字符串,而不使用new关键字,也没有显式使用String对象。
  • 循环数组(Loop on Array<keyof interface>)
    问题 我有一个名为 Item 的对象,我定义了一个包含其字段的接口,以及一个可以更改和定义的字段数组。 当用户想要更新项目时,他发送带有更新项目的 POST 请求,我遍历数组并根据用户的数据更新字段。 问题是 Typescript 抛出了一个错误:Type 'string | number '不可分配给类型' never '。 类型 'string' 不可分配给类型 'never'.ts (2322) 我将不胜感激任何有关该主题的帮助 interface Item { id?: number; title?: string; price?: number; } const requiredItemFields: Array<keyof Item> = [ "title", "price", ] app.post('/update-item', (req, res) => { const existItem: Item = req.body.item; const newItem: Item = {}; for (let filed of requiredItemFields) { if (existItem.hasOwnProperty(filed)) { newItem[filed] = existItem[filed]; << ERROR } } }) 打字稿游乐场 回答1
  • 打字稿:如何为联合类型中的枚举添加类型保护?(Typescript: How to add type guards for enums in union types?)
    问题 以下代码给出错误: “instanceof”表达式的左侧必须是“any”类型、对象或类型参数。 输入'E | C' 不能分配给类型 'E'。 “C”型不能分配给“E”型。 enum E { FIRST = 1, SECOND = 2 }; class C { value: E; constructor(arg: C | E) { if (arg instanceof C) { // 1. this.value = arg.value; } else { this.value = arg; // 2. } } } var a: C = new C(E.SECOND); console.log('a.value = ' + a.value); var b: C = new C(a); console.log('b.value = ' + b.value); 尽管有错误,代码似乎在 TypeScript Playground 上编译得很好,并且达到了预期的效果。 回答1 两个问题。 编译器中存在一个错误,即当联合类型的组成部分之一不是对象类型时, instanceof不允许用于联合类型。 正在修复(https://github.com/Microsoft/TypeScript/issues/2775) 另一件事是instanceof不会导致else块中的缩小(https:/
  • 新的 Typescript 1.8.4 构建错误:“构建:类型 'EventTarget' 上不存在属性 'result'。 ”(New Typescript 1.8.4 build error: “ Build: Property 'result' does not exist on type 'EventTarget'. ”)
    问题 我是打字稿的新手。 在我的 Durandal 应用程序中,我迁移到 VS-2012 到 VS-2015 意味着 typescript 0.9 到 typescript 1.8.4。 迁移后,我遇到了很多构建错误。 我解决了除一个之外的所有问题。 我遇到以下事件类型的构建错误。 错误:“构建:类型 'EventTarget' 上不存在属性 'result'” 代码如下所示: var reader:any, target:EventTarget; reader= new FileReader(); reader.onload = function (imgsrc){ var fileUrl = imgsrc.target.result; } “Imgsrc”正在拍摄类型事件。 它在 typescript 0.9 中工作正常,但在 1.8.4 中它会抛出错误,因为类型“EventTarget”上不存在“result”。 任何人都可以帮助解决这个问题。 注意:“target:EventTarget”来自 lib.d.ts 回答1 虽然any是一种药物(几乎可以用于任何事情,但是...... TypeScript 的好处在哪里) ...... 报告了一个类似的问题并且建议了很好的(TypesScript-ish)解决方法 请求更改 lib.d.ts 的 Event 接口中的
  • “X”类型的参数不能分配给“X”类型的参数(Argument of type 'X' is not assignable to parameter of type 'X')
    问题 再会。 我是 Type Script 的新手,使用 VSCode。 得到以下错误: 错误 TS2322:类型 '() => string' 不能分配给类型 'string'。 错误 TS2322:类型 '() => number' 不能分配给类型 'number'。 编码: DTO.ts interface DTO { getId(): number; getValue(): string; } export = DTO; 链接对象.ts class LinkedObject { public value: string = "Not Set"; public id: number = 0; constructor(value?: string, id?: number) { this.value = value; this.id = id; } } export = LinkedObject; 我正在尝试使用上述接口方法实例化LinkedObject类: TravelClientFormPopulator.ts class TravelClientFormPopulator { public populateComboBoxUsingDTOs(dataObjects: Array<DTO>, comboBoxID: string): void { // Get the
  • 将字符串枚举成员转换为枚举的打字稿函数(Typescript function to convert string enum member to enum)
    问题 我想在 Typescript 中写这样的东西: export function stringToEnum<T>(enumObj: T, str: string): keyof T { return enumObj[str]; } 并按如下方式使用它: enum MyEnum { Foo } stringToEnum<MyEnum>(MyEnum, 'Foo'); 它将返回的地方 MyEnum.Foo 上面的函数按预期工作......但打字错误。 对于stringToEnum<MyEnum>(MyEnum, 'Foo');的参数MyEnum stringToEnum<MyEnum>(MyEnum, 'Foo'); ,打字稿抱怨塔: “typeof MyEnum”类型的参数不可分配给“MyEnum”类型的参数 这是有道理的......不幸的是。 关于如何解决这个问题的任何想法? 回答1 您可以在本地完成所有操作,而无需编写函数: enum Color { red, green, blue } // Enum to string const redString: string = Color[Color.red]; alert(redString); // String to enum const str = 'red'; const redEnum: Color = Color
  • 如何在反应和打字稿中为 forwardRef 扩展引用类型以允许多个引用(How to extend a ref type for forwardRef in react and typescript to allow multiple refs)
    问题 此代码在打字稿下验证: type Ref = HTMLTableElement; const Table = forwardRef<Ref, shapeTable>(({filtered, handleSort, paginationOptions, summary, onMount}, refTable) => { useEffect(() => { if(refTable && typeof refTable !== 'function' && refTable.current) { const tableWidth:string = window.getComputedStyle(refTable.current).getPropertyValue("width"); onMount(tableWidth); } }, [refTable, onMount]); 此代码不会在打字稿下验证: 当我将类型 refTable 放入如下对象中,并更新 Ref 类型以允许这样做时,它不会验证。 我怎样才能解决这个问题? 我需要能够将多个 ref 传递给 forwardRef。 我以前在不使用打字稿的情况下完成了这项工作,并且可以正常工作。 所以关于 forwardRef 的一些东西似乎坚持只有一种 ref 类型可以通过。 除非更新我的 Ref 类型更简单: 类型 '((实例
  • 在打字稿中使用reduce,错误“元素隐式具有'任何'类型,因为类型的表达式不能用于索引类型'{}'”(use reduce in typescript, Error "element implicitly has an 'any' type because expression of type can't be used to index type '{}'")
    问题 我得到错误: 元素隐式具有 'any' 类型,因为类型 'POST_TYPE' 的表达式不能用于索引类型 '{}' 属性 '[POST_TYPE.POST]' 在类型 '{}' 上不存在; 在具有如下接口的函数上使用 reduce 时出错: // enum export const enum POST_TYPE { POST = 'POST', BOARD = 'BOARD', ... } // interface export interface Post { postType?: POST_TYPE[]; } export interface PostType { POST?: boolean; BOARD?: boolean; } // function const exec = (prevType: Post['postType'], type: PostType) => { const prevObject = prevType.reduce((prev, it) => { prev[it] = true; -->> ERROR in prev[it] return prev; }, {}); } 我犯了什么错误? 回答1 一个问题是您的参数prevType: Post['postType']可能是undefined ,因为Post['postType'
  • 类型“void”不可分配给类型“ObservableInput<{}>”(Type 'void' is not assignable to type 'ObservableInput<{}>')
    问题 这个错误在我迁移到 TS 2.2.2 后开始弹出,所以我假设这就是问题所在......代码没有停止工作,但现在我收到了这个错误,我尝试了一些事情,比如返回一个空的 observable ,捕获重新抛出的异常并返回一个对象,似乎没有任何效果。 为什么现在会发生这种情况? 它不应该明白我正在重新抛出异常而不期望返回吗? 我误读了错误吗? 这是完整的错误描述: 这是完整的代码: return request .map((res: Response) => res.json()) .catch((error: any) => { // todo: log? if (error.status == 500) { this.alertService.showError(error.statusText); } else if (error.status == 588) { this.alertService.showAlert(error.statusText); } Observable.throw(error.statusText); }); 我尝试返回 Observable,但我的包装器方法期望返回T类型,这是我的反序列化请求( map(...) )的返回。 如果我确实返回了throw这是我得到的错误: [ts] 类型 'Observable' 不可分配给类型 'T' 我正在使用:
  • 在打字稿中如何修复无法设置未定义的属性“第一个”(In Typescript how to fix Cannot set property 'first' of undefined)
    问题 我想设置一个子属性first是在定义Name的接口,但是当这样做,我总是得到例如一个错误: interface Name{ first: string, last:string, } class Person{ private name:Name public setName(firstName, lastName){ this.name.first = firstName; this.name.last = lastName; } } var person1 = new Person(); person1.setName('Tracy','Herrera'); 运行时出现错误: Cannot set property 'first' of undefined 任何人有一个想法来解决这个问题? 回答1 类属性不会在实例化时自动初始化。 您需要使用相应的对象手动初始化它们——在这种情况下,使用包含由其接口定义的属性的对象: class Person { private name: Name; public setName(firstName, lastName) { this.name = { first: firstName, last: lastName }; } } 另一种方法——例如,如果有多个方法在同一个对象上设置属性——是首先将属性初始化为一个空对象
  • Angular - 类型“字符串”不可分配给类型“布尔值”(Angular - Type 'string' is not assignable to type 'boolean')
    问题 角 4.3.1 角 CLI 1.2.3 打字稿 2.3.4 组件打字稿文件: public saveName: string; public overwrite: boolean; 以下标记失败,当我运行ng build --prod时, Type 'string' is ng build --prod to type 'boolean' <span>{{!overwrite || saveName}}</span> OR <button *ngIf="!overwrite && saveName">Save</button> 但是,它适用于以下情况: <span>{{saveName || !overwrite}}</span> <span>{{overwrite || saveName}}</span> <button *ngIf="saveName && !overwrite">Save</button> <button *ngIf="overwrite && saveName">Save</button> 为什么我会收到那个错误? 更具体地说,为什么只有当我在字符串之前有一个否定的布尔值时才会出现该错误? 回答1 尝试*ngIf="!overwrite && !!saveName"将saveName转换为布尔值 TypeScript 给出错误的原因大致是