类型 'SafeResourceUrl' 不可分配给类型 'string'
Type 'SafeResourceUrl' is not assignable to type 'string'
我正在尝试清理 pdf url 并想将它分配给一个字符串类型变量,以便我可以将它用于 pdf 查看器。有什么办法吗?
如果我对 pdfSrc 类型使用 any
类型,我将得到 Invalid parameter object: need either .data, .range or .url in the <pdf-viewer>
。
注意:我用的URL是为了参考,我会在那个地方使用外部URLs
landingpage.component.ts
import { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';
export class LandingpageComponent implements OnInit {
public pdfSrc: string;
}
constructor(
private sanitizer: DomSanitizer) {
}
fnOpenAsset() {
let url = 'http://localhost/pdf_viewer-master/18/docs/pdf.pdf';
this.pdfSrc = this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
landingpage.component.html
<pdf-viewer class="alignComponentCenter" [src]="pdfSrc"
</pdf-viewer>
如前所述,您可以只删除变量声明(或声明 any
类型),但我怀疑很多人会同意这是正确的解决方案。
各种 Dom 消毒方法不 return 字符串,它们 return 各种对象类型。
查看官方 API 文档:https://angular.io/api/platform-browser/DomSanitizer
this.sanitizer.bypassSecurityTrustResourceUrl(url);
Returns一个SafeResourceUrl
类型的对象,不是字符串;所以你的声明应该反映这一点而不是模糊的 any
类型。
我有办法解决这个问题。我尝试使用 sanitize()
方法再次清理 SafeResourceUrl,其 return 值为 string |无效的。
如果您想使用 bypassSecurityTrustUrl()
,则 SecurityContext.URL
将发生。在我的例子中,我使用了 SecurityContext.RESOURCE_URL
export class LandingpageComponent implements OnInit {
public pdfSrc: string;
}
constructor(
private sanitizer: DomSanitizer) {
}
fnOpenAsset() {
let url = 'http://localhost/pdf_viewer-master/18/docs/pdf.pdf';
this.pdfSrc = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(url));
}```
未来的解决方案
angular 团队正在努力使 Safe*
类型的使用更加灵活。据我了解 angular github 页面上的 issue #33028 他们目前允许直接使用 Safe*
类型作为 string
。这样您就可以使用 bypassSecurityTrustResourceUrl()
并将 return 值直接分配给 src
属性。正如@Muthu 最初尝试的那样。
this.pdfSrc = this.sanitizer.bypassSecurityTrustResourceUrl(url);
这会影响以下类型(因为它们都扩展了 SafeValue
接口):
SafeHtml
SafeUrl
SafeResourceUrl
SafeScript
SafeStyle
当前解决方案
目前访问实际字符串的最佳解决方法似乎是 re-sanitize Safe*
值,就像@Muthu 在他接受的答案中指出的那样。
或者,可以使用 any
类型或在调用函数后使用 as string
强制 return 值成为字符串。请注意,这仅适用于某些场景,例如从 SafeHtml
.
分配 HTML 代码
let html: any = this.sanitizer.bypassSecurityTrustHtml("<h1>just some html!</h1>");
let html2: string = this.sanitizer.bypassSecurityTrustHtml("<h1>even more html!</h1>") as string;
只保留 public pdfSrc
没有任何类型。它会自动转换所需的类型。
import { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';
public pdfSrc;
constructor(private sanitizer: DomSanitizer) {
}
fnOpenAsset() {
let url = 'http://localhost/pdf_viewer-master/18/docs/pdf.pdf';
this.pdfSrc = this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
我正在尝试清理 pdf url 并想将它分配给一个字符串类型变量,以便我可以将它用于 pdf 查看器。有什么办法吗?
如果我对 pdfSrc 类型使用 any
类型,我将得到 Invalid parameter object: need either .data, .range or .url in the <pdf-viewer>
。
注意:我用的URL是为了参考,我会在那个地方使用外部URLs
landingpage.component.ts
import { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';
export class LandingpageComponent implements OnInit {
public pdfSrc: string;
}
constructor(
private sanitizer: DomSanitizer) {
}
fnOpenAsset() {
let url = 'http://localhost/pdf_viewer-master/18/docs/pdf.pdf';
this.pdfSrc = this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
landingpage.component.html
<pdf-viewer class="alignComponentCenter" [src]="pdfSrc"
</pdf-viewer>
如前所述,您可以只删除变量声明(或声明 any
类型),但我怀疑很多人会同意这是正确的解决方案。
各种 Dom 消毒方法不 return 字符串,它们 return 各种对象类型。
查看官方 API 文档:https://angular.io/api/platform-browser/DomSanitizer
this.sanitizer.bypassSecurityTrustResourceUrl(url);
Returns一个SafeResourceUrl
类型的对象,不是字符串;所以你的声明应该反映这一点而不是模糊的 any
类型。
我有办法解决这个问题。我尝试使用 sanitize()
方法再次清理 SafeResourceUrl,其 return 值为 string |无效的。
如果您想使用 bypassSecurityTrustUrl()
,则 SecurityContext.URL
将发生。在我的例子中,我使用了 SecurityContext.RESOURCE_URL
export class LandingpageComponent implements OnInit {
public pdfSrc: string;
}
constructor(
private sanitizer: DomSanitizer) {
}
fnOpenAsset() {
let url = 'http://localhost/pdf_viewer-master/18/docs/pdf.pdf';
this.pdfSrc = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(url));
}```
未来的解决方案
angular 团队正在努力使 Safe*
类型的使用更加灵活。据我了解 angular github 页面上的 issue #33028 他们目前允许直接使用 Safe*
类型作为 string
。这样您就可以使用 bypassSecurityTrustResourceUrl()
并将 return 值直接分配给 src
属性。正如@Muthu 最初尝试的那样。
this.pdfSrc = this.sanitizer.bypassSecurityTrustResourceUrl(url);
这会影响以下类型(因为它们都扩展了 SafeValue
接口):
SafeHtml
SafeUrl
SafeResourceUrl
SafeScript
SafeStyle
当前解决方案
目前访问实际字符串的最佳解决方法似乎是 re-sanitize Safe*
值,就像@Muthu 在他接受的答案中指出的那样。
或者,可以使用 any
类型或在调用函数后使用 as string
强制 return 值成为字符串。请注意,这仅适用于某些场景,例如从 SafeHtml
.
let html: any = this.sanitizer.bypassSecurityTrustHtml("<h1>just some html!</h1>");
let html2: string = this.sanitizer.bypassSecurityTrustHtml("<h1>even more html!</h1>") as string;
只保留 public pdfSrc
没有任何类型。它会自动转换所需的类型。
import { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';
public pdfSrc;
constructor(private sanitizer: DomSanitizer) {
}
fnOpenAsset() {
let url = 'http://localhost/pdf_viewer-master/18/docs/pdf.pdf';
this.pdfSrc = this.sanitizer.bypassSecurityTrustResourceUrl(url);
}